# 索引种类:
# 普通索引 加速查找
# 主键索引 加速查找 不能重复 不能为空
# 唯一索引 加速查找 不能重复
# 联合索引(多列): 联合主键索引 联合唯一索引 联合普通索引
# 无索引:从前到后依次查找
# 有索引:额外的文件保存特殊的数据结构。查询快。插入更新慢
# 索引种类之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)
# 连表时注意条件类型一致
# 索引散列值(重复少)不适合建索引。例:性别不适合