mysql explain

mysql EXPLAIN列的解释:

type 表示mysql在表中找到所需行的方式,或者叫访问类型。

常见访问类型如下,从上到下,性能由差到最好:

ALL

全表扫描

index

索引全扫描

range

索引范围扫描

ref

非唯一索引扫描

eq_ref

唯一索引扫描

const,system

单表最多有一个匹配行

NULL

不用扫描表或索引

 

Extra: 执行情况的说明和描述, 包含不适合在其他列中显示但是对执行计划非常重要的额外信息. 最主要的有一下三种:

Using Index

表示索引覆盖,不会回表查询

Using Where

表示进行了回表查询

Using Index Condition

表示进行了ICP优化

Using Flesort

表示MySQL需额外排序操作, 不能通过索引顺序达到排序效果

 

索引设计的原则

  1. 适合索引的列是出现在where子句中的列,或者连接子句中指定的列
  2. 基数较小的类,索引效果较差,没有必要在此列建立索引
  3. 使用短索引,如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间
  4. 不要过度索引。索引需要额外的磁盘空间,并降低写操作的性能。在修改表内容的时候,索引会进行更新甚至重构,索引列越多,这个时间就会越长。

 

负向条件查询不能使用索引,可以优化为 in 查询。

负向条件有:!=、<>、not in、not exists、not like ;

 

范围条件查询可以命中索引

范围条件有:<、<=、>、>=、between等; 范围列可以用到索引(联合索引必须是最左前缀),但是范围列后面的列无法用到索引,索引最多用于一个范围列,如果查询条件中有两个范围列则无法全用到索引

 

建立索引的列,不允许为 null

单列索引不存 null 值,复合索引不存全为 null 的值,如果列允许为 null,可能会得到“不符合预期”的结果集,所以,请使用 not null 约束以及默认值。

 

利用覆盖索引进行查询,避免回表

被查询的列,数据能从索引中取得,而不用通过行定位符 row-locator 再到 row 上获取,即“被查询列要被所建的索引覆盖”,这能够加速查询速度。

 

多表关联时,要保证关联字段上一定有索引

 

业务上具有唯一特性的字段,即使是多个字段的组合,必须建成唯一索引

 

对于自己编写的SQL查询语句,要尽量使用EXPLAIN命令分析一下,做一个对SQL性能有追求的程序员。衡量一个程序员是否靠谱,SQL能力是一个重要的指标。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值