版权声明:版权由我个人所有,未经允许不得用于除学习外的其他用途,望周知。 https://blog.csdn.net/weixin_44515563/article/details/89676687
mysql官方对索引的定义为:索引(index)是帮助mysql高效获取数据的数据结构。
索引的本质是数据结构
排好序的快速查找数据结构
单值索引:即一个索引只包含单个列,一个表可以有多个单列索引。
唯一索引:索引列的值必须唯一,但允许有空值。
复合索引:即一个索引包含多个列。
mysql query optimizer 查询优化器
linux中用top,free,iostat.vmstat 等来进行分析。
explain (执行计划) explain+sql语句
id select_type table type possible_keys key key_len ref rows extra
id 代表:
{
id 相同,执行顺序由上至下
id不同,如果是子查询,id的序号会递增,id值越大,优先级越高,越先被执行。
id相同又不同,同时存在
}
如果id相同,可以认为是一组,从上往下顺序执行。
在所有组中,id值越大,优先级越高,越先执行。
select_type:
{
1.simple 简单查询
2.primary 主查询
3.subquery 子查询
4.derived 衍生
5.union 联合
6.union result
}
type:
{
从最好到最差(常用的部分)system>const>eq_ref>ref>range>index>all
system:表示系统表之类的。长量
const --常量
eq_ref --唯一性索引(主键,唯一)
range --范围
index--索引扫描
all--全表扫描
}
possible_keys:可能用到的索引,一个或多个。但不一定被查询实际使用
key:实际使用的索引
key_len:长度越短越好,定义算出,不是实际的。
ref :
rows–越小越好
extra–额外信息
{
1.using filesort 文件排序 不好 (九死一生)
2.using tempoaray 临时表 非常不好(十死无生)
3.using index --速度不错 好事
}
sql优化注意事项:
{
## 1.全值匹配我最爱
## 2.最佳左前法则
## 3.不在索引列上左任何操作(计算,函数,(自动或手动)类型转换),会导致索引失效而转向全表扫描。
## 4存储引擎不能使用索引中范围条件右边的列
## 5.尽量使用覆盖索引(只访问索引的查询列一致),减少select *
## 6.mysql 在使用不等于(!=或者<>)的时候无法使用索引,导致全表扫描
## 7. is null is not null 也无法使用索引
## 8.like 以通配符开头(‘%aaa’)mysql索引失效会变成全表扫描的操作
## 9.字符串不加单引号索引失效
## 10.少用or来连接时索引会失效
}
记忆口诀:
1.带头大哥不能死
2.中间兄弟不能断
3.索引列上无计算
4.like %加右边
5.范围之后全失效
6.字符串上加引号