MySQL索引

什么是索引?

排好序快速查找的数据结构就是索引

索引作用

提高检索效率,降低数据库对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字段
排序的字段
查询中统计或分组的字段
如果表记录太少,经常增删改的表,某列字段重复数据较多就不要建立索引

索引优化

1.索引有多列时,遵循左前法则;顺序从左开始且不要跳过中间的索引,否则索引失效全盘扫描(带头大哥不能死,中间兄弟不能断)
3.不要再索引列上做任何操作,包括计算、函数、自动或者手动类型转换,否则导致索引失效(索引列上无计算)
4.范围条件查询之后的索引全部失效,使用范围查询时,有时会使用索引,有时会失效,这是因为使用范围条件的数据量有一定的范围(范围之后全失效)
5.索引列尽量和查询列一致,减少select *
6.使用“<>”或“!=”导致索引失效
7.is null,is not null也会导致索引失效
8.like的“%”在右边不会导致索引失效;查询的列匹配索引列,使用like ‘%xxx%’索引不会失效(like%加右边)
9.字符串不加单引号或导致索引失效(字符串里有引号)
10.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,可以考虑分组去重
原文地址:https://www.cnblogs.com/-zzc/p/13618841.html