什么是索引?
排好序快速查找的数据结构就是索引
索引作用
提高检索效率,降低数据库对IO成本;降低数据排序,减少cpu消耗
索引类型
单值索引:一个索引包含单个列,一个表可以有多个单值索引
唯一索引:索引值必须唯一,但允许有空值
复合索引:一个索引包含多个列
基本语法
创建索引
CREATE [UNIQUE](唯一) INDEX indexname(索引名称) ON tablename(表名) (columnname(length)字段和类型)
该命令可以添加普通索引或唯一索引[UNIQUE]
或者
ALTER TABLE tablename ADD PRIMARY KEY (columnname_list) ---主键索引
ALTER TABLE tablename ADD INDEX UNIQUE indename(columnname_list) ---唯一索引
ALTER TABLE tablename ADD INDEX indename(columnname_list) ---普通索引
ALTER TABLE tablename ADD INDEX FULLTEXT indename(columnname_list) ---全文索引
删除索引
DROP INDEX [indexname] ON table
查看索引
SHOW INDEX FROM table
那些情况需要创建索引
- 主键自动创建索引
- 频繁作为查询条件的字段
- 连表关联的字段,外键关系创建索引
- 高并发下创建复合索引
- where字段
- 排序的字段
- 查询中统计或分组的字段
如果表记录太少,经常增删改的表,某列字段重复数据较多就不要建立索引
索引优化
- 索引有多列时,遵循左前法则;顺序从左开始且不要跳过中间的索引,否则索引失效全盘扫描(带头大哥不能死,中间兄弟不能断)
- 不要再索引列上做任何操作,包括计算、函数、自动或者手动类型转换,否则导致索引失效(索引列上无计算)
- 范围条件查询之后的索引全部失效,使用范围查询时,有时会使用索引,有时会失效,这是因为使用范围条件的数据量有一定的范围(范围之后全失效)
- 索引列尽量和查询列一致,减少select *
- 使用“<>”或“!=”导致索引失效
- is null,is not null也会导致索引失效
- like的“%”在右边不会导致索引失效;查询的列匹配索引列,使用like ‘%xxx%’索引不会失效(like%加右边)
- 字符串不加单引号或导致索引失效(字符串里有引号)
- or用来连接时导致索引失效,但是可以把or用union all代替
关联查询优化
- 保证被驱动表的join字段已经被索引
- left join 时,选择小表作为驱动表,大表作为被驱动表
- inner join 时,mysql会自己帮你把小结果集的表选为驱动表
- 子查询尽量不要放在被驱动表,有可能使用不到索引
子查询优化
- 在使用"in"时,用大表驱动小表,"exists"时用小表驱动大表
order by关键字优化
- ORDER BY子句,尽量使用Index方式排序,避免使用FileSort方式排序
- 尽可能在索引列上完成排序操作,遵照索引建的最佳左前缀
- where子句中如果出现索引的范围查询(即explain中出现range)会导致order by 索引失效。
group by关键字优化
- group by实质是先排序后进行分组,遵照索引建的最佳左前缀
- where高于having,能写在where限定的条件就不要去having限定了。
- 当无法使用索引列,增大max_length_for_sort_data参数的设置+增大sort_buffer_size参数的设置
- 尽量不要使用 distinct,可以考虑分组去重
MySQL索引
原文:https://www.cnblogs.com/-zzc/p/13618841.html