1、索引

1.1、分类

单列索引:即一个索引只包含单个列。
Create 【UNIQUE 】 INDEX ‘index_name’ ON ( column ) — 新增索引
ALTER TABLE table_name ADD INDEX ‘index_name’ ( column ) — 新增索引
ALTER TABLE table_name drop INDEX index_name — 删除索引
联合索引(复合索引):即一个索引包含多个列。
ALTER TABLE table_name ADD INDEX (column1,column2,column3); — 新增联合索引
使用联合索引注意事项:符合最左原则;就是索引往左查才有效;比如单独查询column1列;如果是单独查询column2或者column3无效。这就是最左原则。
image.png

覆盖索引:该索引包含查询中用到的所有字段;意思是无论单列索引还是组合索引;查询列是包含所有索引(比如索引A;查询列A就算;A、B为一个索引;就必须列都有A、B;*不算)

唯一索引:它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

  • ALTER TABLE table_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。

explain select from p_user WHERE name=‘B’ — *explain函数验证索引是否有效

1.2、索引失效

第一种:where 子句中使用 != 或 <> 操作符,引擎将放弃使用索引而进行全表扫描。(当在where条件中有指定 = 或者 <>有范围操作的字段列;可直接放弃范围查询字段的建立索引)
第二种:where 子句中使用 or 来连接条件,将导致引擎放弃使用索引而进行全表扫描,即使其中有条件带索引也不会使用,这也是为什么尽量少用 or 的原因。
第三种:对于多列索引,不是使用的一部分,则不会使用索引。
第四种:如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不会使用索引。
第五种:like的模糊查询以 % 开头,索引失效。
第六种:在 where 子句中对字段进行表达式操作,导致引擎放弃使用索引而进行全表扫描。
第七种:在 where 子句中对字段进行函数操作,导致引擎放弃使用索引而进行全表扫描。
第八种:在 where 子句中的 “=” 左边进行函数、算术运算或其他表达式运算,导致系统将可能无法正确使用索引。
第九种:不适合键值较少的列(重复数据较多的列)

1.3、Explain 聚合函数操作

用法很简单;只需要在sql前加Explain。列如:explain select * from table_name
image.png
以上字段说明:
Extra :扩展信息包括了
Using filesort : 比较危险的示警;代表了mysql使用一个外部索引将查询结果集重新进行排序。可想而知会浪费一定的时间。order by 和 group by 将会产生这样。
Using temporary:危险的示警;使用了临时表保存中间结果;mysql在对查询结果的排序时使用了临时表。order by 和 group by 将会产生这样。
Using index:发财了;证明效率最高的一种;当在索引即是出现在查询列中也是作为条件。如果是多个条件的之一的话;则不属于Using index。所以满足其条件就是查询和条件必须是一致。查询列只要满足属于其中索引即可。
Using where

1.4、总结

假设index(a,b,c)

where语句 索引是否被引用
where a = 3 使用到a
where a = 3 and b = 4 使用到a 、b
where a = 3 and b = 4 and c = 5 使用到a 、b、c
where b = 3 或者 where b = 4 and c = 5 或者
where c = 5
失效(不符合最左原则)
where a = 3 and c = 5 使用到了a;但是c失效;因为b中断了。
where a = 3 and b > 4 and c = 5 使用到了a和b;但是c失效;因为c不能使用在范围之后;b中断了
where a = 3 and b like ‘4%’ and c = 5 使用到了a和b、c
where a = 3 and b like ‘%4’ and c = 5 只用到a
where a = 3 and b like ‘%4%’ and c = 5 只用到a
where a = 3 and b like ‘4%4%’ and c = 5 使用到了a和b、c

1、一张表最好不超过5个索引。
2、两表left join 与 right join 相反加索引;左连接最好向右边表的字段加索引;右连接则相反。
3、三表连接会出现连接缓存;也是符合连接最好向右边表的字段加索引;右连接同此。三表左连接将右两张表字段加索引;右连接则相反。
4、小表驱动大表查询()
5、order by
image.png
5、group by

2、慢查询分析

mysql默认情况下没有开启慢查询日志的;需要手动开启。当然如果不是调优的话;一般建议不开启;多多少少影响一定的性能;慢查询支持将慢查询的sql语句做记录。
查看默认设置:
show variables like ‘slow_query_log%’;
image.png
咋们看下默认多少秒的sql语句才算慢查询: 显示默认为10秒的sql语句。
show variables like ‘long_query_time’;
image.png

设置命令:
set global long_query_time = 3 //—将慢sql时间定义为3秒。

以上是全靠命令设置局部的变量;如果需要设置永久性的;就得修改配置my.cnf文件信息:
image.png
根据以上筛选出慢sql;再结合explain 属性;分析出问题所在 。
如果explain 分析解决不了;就再根据show profile进行sql分析。show profile默认是不开启的状态;
并且默认保存最近15条运行的sql语句。