在日常开发中,使用到的数据表经常都会有索引,这些索引可能是开发人员/DBA建表时创建的,也可能是在使用过程中新增的。合理的使用索引,可以加快数据库查询速度。然而,在实际开发工作中,会出现有些sql语句执行时不会使用索引、而使用了全表扫描的情况,造成执行速度慢的问题。下面我列举两种比较典型的场景:

  场景一:mysql时间字段上使用like

表结构:
CREATE TABLE `orders` (
`orders_id` int(11) NOT NULL,
`order_status` tinyint(4) NOT NULL,
`date_purchased` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`orders_id`),
KEY `idx_date_purchased` (`date_purchased`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
原始语句:

注意到此sql只返回一条结果集,但是有like,把时间字段当成字符串处理了,就做了隐式转换,故没法走索引,而是走了全表扫描。

修改后的sql:

  场景二:字本身是字符类型,但是where 条件后却用整形(没有加引号)。

  为了避免上述问题,除了日常开发中多加小心外,还可以通过explain来检查sql是否使用索引。方法如下:

(1) 登录Linux服务器mysql环境(注意不要使用windows本机环境的mysql进行测试,因为测试发现windows mysql下explain检查结果和linux mysql有不一致的情况)

(2) 将mybatis resource文件中的sql语句中的变量填写成具体值,并在sql语句前加explain执行,如下:

explain执行结果关注以下几个字段:

type:

显示sql执行的类型,从最好到最差的类型为system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL。一般来说,type至少要达到range级别,最好达到ref级别,低于range级别的sql必须进行优化。

key:

         显示sql执行过程中实际使用的键或索引,如果为null则表示未使用任何索引,必须进行优化。

Extra:

如果是Only index,这意味着信息只用索引树中的信息检索出的,这比扫描整个表要快。

如果是where used,就是使用上了where限制。

如果是impossible where 表示用不着where,一般就是没查出来啥。

如果此信息显示Using filesort或者Using temporary的话会很吃力,WHERE和ORDER BY的索引经常无法兼顾,如果按照WHERE来确定索引,那么在ORDER BY时,就必然会引起Using filesort,这就要看是先过滤再排序划算,还是先排序再过滤划算。

最新文章

  1. Greenplum 的分布式框架结构
  2. 点击区域外隐藏该区域,event.stopPropagation()
  3. windows 下 putty 登陆服务器 显示matlab图形界面
  4. objectarx 卸载加载arx模块
  5. MySQL 高可用MHA安装部署以及故障转移详细资料汇总 转
  6. VC中实现带有背景位图的树型控件
  7. Cassandra
  8. CentOS7 安装 OpenSSL 1.0.1m 和 OpenSSH 6.8p1
  9. Ethercat 学习总结一:协议总结
  10. QPainterPath 不规则提示框(二)
  11. 操作DataTable数据,修改某列的值
  12. OpenGL.Tutorial文章转载
  13. CSS如何让不相等的字符上下对齐
  14. Hadoop HBase概念学习系列之HBase里的Zookeeper(二十一)
  15. 第九次CSP第四题 - 压缩编码
  16. Python学习之路 (四)爬虫(三)HTTP和HTTPS
  17. windows下的mysql迁移到linux下
  18. 体积雾 global fog unity 及改进
  19. Python(面向对象3 ——实例)
  20. Dedesql数据库类详解(二次开发必备教程)(转)

热门文章

  1. New UWP Community Toolkit - RadialProgressBar
  2. 第1次作业:no blog no fun
  3. C语言第三次作业---单层循环结构
  4. 【Alpha版本】冲刺阶段 - Day1 - 启航
  5. 201621123035 《Java程序设计》第1周学习总结
  6. iOS开发之UITextView,设置textViewplaceholder
  7. v7000数据恢复_MDisk重建数据恢复方法(北亚数据恢复)
  8. CISCO路由器练习
  9. php框架中的phalcon框架的安装,及初步认识,从表单提交简单的数据到数据库中
  10. Mybatis和Hibernate本质区别和应用场景