# 索引种类:

# 普通索引 加速查找

# 主键索引 加速查找 不能重复 不能为空

# 唯一索引 加速查找 不能重复

# 联合索引(多列): 联合主键索引 联合唯一索引 联合普通索引

# 无索引:从前到后依次查找

# 有索引:额外的文件保存特殊的数据结构。查询快。插入更新慢

# 索引种类之hash索引:

# 会把内容转换成hash值+内容存储地址放到新建表里(存储位置是无序的,所以查找单值速度很快,范围查找会慢)

# 索引种类之btree索引(常用):

# 会把内容值转换成数字以二叉树形式存储

# 创建普通索引:

# 例1 create index 索引别名 on 表(列);

# 例2 create table tablename(

# id int not null auto_increment primary key,

# name varchar(32) not null,

# index 索引别名 (name) # 创建表结构时 创建普通索引

# )

# 创建唯一索引:

# 例1 create unique index 索引别名 on 表(列);

# 例2 create table tablename(

# id int not null auto_increment primary key,

# name varchar(32) not null,

# unique 索引别名 (name) # 创建表结构时 创建唯一索引

# )

# 创建主键索引:

# alter table 表名 add primary key(列)

# 创建局部索引:

# create index 索引别名 on 表(列(前多少字符作为索引))

# 删除普通索引(删除生成的索引文件):

# drop index 索引别名 on 表;

# 删除唯一索引:

# drop unique index 索引别名 on 表;

# 覆盖索引(名词):

# 在索引特殊数据结构文件里直接就能拿到想要的值(在索引文件中直接获取数据)

# 例 id 为索引列:select id from userinfo where id='999';

# 索引合并(名词)(没有联合索引的效率高):

# 把多个单列索引合并使用

# 例 id 和 email为索引列:select * from userinfo where id=999 and email='999@qq.com';

# 最左前缀匹配:

# create index in_name_email_id on userinfo(name,email,id);

# select * from userinfo where name='xxx'; # 走索引

# select * from userinfo where name='xxx' and id='xxx'; # 走索引

# select * from userinfo where email='xxx' # 不走索引;

# 命中索引(假设userinfo表里,id和email为索引列):

# like 慢

# select * from userinfo where email='xxx'; 命中

# select * from userinfo where email like 'xxx'; 慢

# 函数 慢

# select * from userinfo where reverse(email)='xxx'; 慢

# or 慢

# select * from userinfo where id=xxx or name='xxx'; # 用or如果其中一列不为索引将会 慢

# select * from userinfo where id=xxx or name='xxx' and email='xxx' # 命中, 因为这里会使用id和email,不会使用name查找

# 类型不一致 慢

# (如果email为varcha类型) select * from userinfo where email=999; # 却使用int查询的话,慢

# != 对普通索引会 慢 (但如果该列是主键的话,!=还是会走索引)

# > 普通索引会 慢,(主键,整数类型,还是会走索引)

# order by (主键,还是会走索引)

# select name from userinfo order by email desc; 慢

# select email from userinfo order by email desc; 走索引

# 其他注意事项:

# 避免使用 select *

# count(1)或count(列) 代替count(*)

# 创建表时尽量是char代替varchar

# 表的字段顺序固定长度的字段优先

# 组合索引替代多个单列索引(经常使用多个条件查询时)

# 尽量使用短索引

# 使用连接(join)来代替子查询(sub-queries)

# 连表时注意条件类型一致

# 索引散列值(重复少)不适合建索引。例:性别不适合