-
MySQL运行机制
- MySQL每个query只能运行在一个CPU上,更多的CPU,更快的CPU会更有利于并发
-
MySQL执行计划
- Using filesort: 表示无法利用索引完成排序,也有可能是因为多表连接时,排序字段不是驱动表中的字段MySQL中无法利用索引完成的排序操作称为"文件排序"。
- Using temporary:表示需要创建临时表以满足需求,通常是因为GROUP BY的列没有索引,或者GROUP BY和ORDER BY的列不一样,也需要创建临时表,建议添加适当的索引。
- Using index: 表示相应的select 操作中使用了覆盖索引(Covering index),避免访问了表的数据行,效果不错!如果同时出现Using where,表明索引被用来执行索引键值的查找。如果没有同时出现Using where,表示索引用来读取数据而非执行查找动作。
- Covering Index:覆盖索引也叫索引覆盖,就是select 的数据列只用从索引中就能够取得,不必读取数据行,MySQL可以利用索引返回select 列表中的字段,而不必根据索引再次读取数据文件。
- Using index condition: 在5.6版本后加入的新特性,优化器会在索引存在的情况下,通过符合RANGE范围的条数 和 总数的比例来选择是使用索引还是进行全表遍历。
- Using where: 表明使用了where 过滤
- Using join buffer: 表明使用了连接缓存
- impossible where: where 语句的值总是false,不可用,不能用来获取任何元素
- distinct: 优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作。
- 注意
- 看下 type 这列的结果,如果有类型是 ALL 时,表示预计会进行全表扫描(full table scan)。通常全表扫描的代价是比较大的,建议创建适当的索引,通过索引检索避免全表扫描
- 再来看下 Extra 列的结果,如果有出现 Using temporary 或者 Usingfilesort 则要多加关注
-
MySQL如何使用索引
- 索引匹配流程
- 建索引的原则
1.最左前缀匹配原则,非常重要的原则 2.选择区分度高的列作为索引,即一个字段值的分布要多,像状态值这种只有几个值的就不要建了 3.索引列不能参与计算 4.尽量的扩展索引,不要新建索引
- MySQL如何使用索引提高查询效率
- 使用索引的场景
1、匹配全值 对索引中所有列都指定具体值,即对索引中的所有列都有等值匹配的条件 2.匹配值的范围查询 对索引的值能够进行范围查找 3.匹配最左前缀 仅仅使用索引中的最左边列进行查询 4.仅对索引进行查询
- 不使用索引的场景
1.以%开头的like查询 2.数据类型出现隐式转化,不会使用索引 3.组合索引,不满足最左原则,不使用聚合索引 4.用or分割条件,若or前后只要有一个列没有索引,就都不会用索引 使用 union all代替提高效率 5.使用!= 或 <> 操作符时 6.索引部分等值匹配,部分范围匹配
- 索引匹配流程
-
SQL使用的规范
1.禁止使用SELECT *,只获取必要的字段,需要显示说明列属性2.禁止使用INSERT INTO t_xxx VALUES(xxx),必须显示指定插入的列属性
3.禁止使用属性隐式转换
4.禁止在WHERE条件的属性上使用函数或者表达式
5.禁止负向查询,以及%开头的模糊查询
负向查询条件:NOT、!=、<>、!<、!>、NOT IN、NOT LIKE等,会导致全表扫描6.禁止大表使用JOIN查询,禁止大表使用子查询
7.禁止使用OR条件,必须改为IN查询,或者 union、union all
8.应用程序必须捕获SQL异常,并有相应处理
《SQL优化入门》讲座总结
只言片语任我说,提笔句句无需忖。落笔不知寄何人,唯有邀友共斟酌。