#背景
在项目开发中,给我安排一个新的任务,任务简单做是要查询历史表有没有这条数据,历史表的数据每天都会更新,是迭代递增更新,当前表的数据全部插入到历史表中,表里的主键是日期,随着日积月累的归档更新,历史表的数据量会达到百万级别,没有分表,也没有分库的处理,只能硬查表。
简单查询了一下sql(根据日期过滤),发现查询200万条需要35秒,如此耗时肯定是不行的。
正文:
于是决定使用explain,查询看下sql 查询的索引信息。explain +sql语句 能更好的帮助开发人员分析问题,expliain 能显示MYsql该如何使用,可以写出更优化的sql查询语句。
如
会看到返回10个参数,
id | sleect标识符,select查询序列号, |
selec_type | select 语句的类型 普通查询,联合查询,子查询等 |
table | 表示这行的数据查的哪个表 |
partitions | 展示查询访问的分区 |
type(重要) | 访问级别不同的结果,表示查询的查询的等级好坏 |
key(重要) | 实际用的索引, |
key_len | 索引长度 |
ref | 表示索引命中的列或者常量 |
row | mysql认为执行查询必须检查的行数 |
filtered | 表示按表条件过滤的表行的估计百分比,最大100,表示未过滤行 |
Extra | 包含解析查询的其他信息 |
这10个字段信息,表示的含义还挺重要的,不过常用的数据信息,
key :查看有没有使用索引
key_len :查看索引的使用是否充分
type:查看索引类型
Extra :查看附件信息,如:排序、临时表、where 条件为false等
一般情况下根据这四个就能定位索引问题。