这段是废话 : 为什么要定位慢查询?用户请求,如果超过0.5s 没有反馈,就会丧失耐心。刨除 网络IO,页面渲染 时间,留给数据库查询的时间,着实没有多少了,0.3S ? 但实际上,一个业务请求,包含多次数据库查询,数据库自己也有网络IO的请求。
所以一个sql 查询,要尽可能的缩短查询时间。
如何增加查询速度?最有效的方法:索引
如何确定索引是否有效? explain 命令
现有一张 84W 条数据的表
直接模糊查询 某content_text字段中,包含 大盘 俩字的条数,耗时2s +
重点在这儿:
在sql 语句前,加上 explain ,再执行,可以得到sql 执行的分析结果。
这里type :ALL ,rows 99W。 为什么比真实条数还大?因为explain 的rows 计数,是估算值,不是准确值。
但也可以分析得出: 这是一个全表查询,我们大概要从99W条数据中,找到7W条数据。 这计算量太大啦。
再看一条数据查询:
rows 为1,type 为const。 直接通过主键,查询指定行内容,这速度自然更快,0.126 s
这里,type 共有 7 种:
type = ALL :全表扫描
type = index : 索引扫描,mysql 遍历整个索引来查询匹配的行
type= range: 索引范围扫描,常见于 < , <= ,> , >=, betweent等操作符。
type = ref : 使用非唯一索引或唯一索引的前缀扫描,返回匹配某个单独值的记录行
type = eq_ref : 类似ref, 区别在于使用的所以是唯一索引。
type = const/system, 单表中最多有一个匹配行,查询起来非常迅速,如主键或唯一索引等
type = NULL :type 不用访问表或者索引,就能直接得到结果.
从mysql 4.1版本开始, 引入 explain extended 命令,可以查看到SQL在执行前,被优化器做了哪些改写。