日常写SQL中可能会有一些小细节忽略了导致整个sql的性能下降了好几倍甚至几十倍,几百倍。以下这个示例就是mysql语句中的一个单引号('')引发的性能耗损,我相信很多朋友都遇到过,甚至还在这样写。

先看下我的表结构:

CREATE TABLE `d_sku` (`id` varchar(36) NOT NULL,`commodity_id` varchar(36) DEFAULT NULL,`counts` int(11) DEFAULT NULL,`price` double(15,2) DEFAULT NULL,`status` int(11) DEFAULT NULL,`location` varchar(100) DEFAULT NULL,`create_time` datetime DEFAULT NULL,`create_id` varchar(36) DEFAULT NULL,`modify_time` datetime DEFAULT NULL,`provalue_str` varchar(500) DEFAULT NULL,`category_id` varchar(36) DEFAULT NULL,`customer_id` varchar(36) DEFAULT NULL,`cert_no` varchar(100) DEFAULT NULL,`profit` double DEFAULT NULL,`check_cargo` int(11) DEFAULT '0',`check_time` datetime DEFAULT NULL,`keep_last_checked` int(11) DEFAULT NULL,`approval_status` int(11) DEFAULT '0',`code` varchar(30) DEFAULT NULL,PRIMARY KEY (`id`),KEY `index_price` (`price`) USING BTREE,KEY `index_category_status` (`category_id`,`status`) USING BTREE,KEY `index_modifytime` (`modify_time`) USING BTREE,KEY `index_customerId_categoryId` (`customer_id`,`category_id`) USING BTREE,KEY `index_certNo_customerId` (`cert_no`,`customer_id`) USING BTREE,KEY `index_provaluestr` (`provalue_str`(320)) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC

一个电商平台的SKU数据库表结构模式,该表中数据条数376138。以此下两种查询方式看下执行效率。查询语句都是从该表中查询一条数据分类为d2a17030-149d-11e5-a9de-000c29d7a3a0并且编号为5186354366的数据。

1.实例测试

1.对查询内容添加单引号

SELECT * FROM d_sku d where category_id='d2a17030-149d-11e5-a9de-000c29d7a3a0' and  d.cert_no='5186354366';

【消息】:执行成功,当前返回:[1]行,耗时:[1ms.]。查询速度非常快。

2.对查询内容不添加单引号

SELECT * FROM d_sku d where category_id='d2a17030-149d-11e5-a9de-000c29d7a3a0' and  d.cert_no=5186354366;

【消息】:执行成功,当前返回:[1]行,耗时:[1210ms.]发现两者之间的执行效率显而易见啊。

2.两者区别分析

这样一查询效果真的是显而易见,添加单引号查询才1ms,不添加单引号查询的耗时是1210ms.一条数据就这么明显了。可想而知这种性能损失有多大。但是为什么会这样呢?先从分析索引看起。使用关键词 “explain” 查看sql执行效率详细(关键词使用介绍点传送门)。

explain  SELECT * FROM d_sku d where category_id='d2a17030-149d-11e5-a9de-000c29d7a3a0' and  d.cert_no='5186354366';explain  SELECT * FROM d_sku d where category_id='d2a17030-149d-11e5-a9de-000c29d7a3a0' and  d.cert_no=5186354366;

图一:添加单引号

图二:未添加单引号

两条数据对比分析:

图一:

添加单引号后的性能详情,其中表头key这里显示出来真正使用了组合索引“index_certNo_customerId” ,其中这两个索引对应的列正好是“category_id”和“cert_no”。再看rows这,表示查询这条数据只检索了一条数据,因为是这里索引生效了,所以通过“cert_no”编号直接查询到了数据。

图二:

未添加单引号后的性能详情,发现真正使用的索引只有“index_category_status”,回到创建表结构的时候可以发现这条索引信息是添加`category_id`,`status`这两个列的,表示只用到了category_id,而第二个条件的cert_no列并没有用到索引,所以性能的损耗就在这里发生了。

总结:

原因就是因为我们创建表结构的时候cert_no字段是varchar类型的,而where时未添加单引号的时候参数是被做为数字类型来使用的,那不同的类型做查询的时候肯定是要转型的,数据类型转换的话就无法正常使用索引了。所以可以得到一个结论就是Int类型的数据在转换varchar再使用是不会使用索引的。我们可以修改表结构将cert_no改为int类型后在使用不添加单引号的参数查询时性能也就是正常的了。同样也是可以通过添加单引号来实现。

转载于:https://www.cnblogs.com/david97/p/8072276.html

Mysql中where条件一个单引号引发的性能损耗相关推荐

  1. mysql中双引号和单引号有什么区别

    mysql中双引号和单引号有什么区别 前2天看到有人问,mysql中双引号和单引号有什么区别? 希望大家可以关注下公众号,支持一下,鞠躬感谢~ 我就直接po代码和截图了,如下 select * fro ...

  2. MySQL中 反引号、单引号 和 双引号 的区别

    MySQL中反引号(``).单引号('')和双引号("")的区别 反引号(``) 即电脑 esc 正下方那个键,它是为了区分MySQL的保留字与普通字符而引入的符号.一般我们建表时 ...

  3. python引号嵌套_【python】sql语句插入中内容同时包含单引号和双引号的解决办法...

    在python中调用MySQLdb模块插入数据信息,假设待输入信息data为: Hello'World"! 其中同时包含了单引号和双引号 一般插入语句为 sql = "insert ...

  4. mysql 中修改对象_在MySQL中,创建一个数据库后,还可以对象其进行修改,不过这里的修改是指可以修改被创建数据库的相关参数,也可以修改数据库名。...

    [多选题]注射时,在(  )情况下,采用较高的注射速率. [单选题]通常,所设置的模具温度是指和制品接触的模腔内表面在(   ). [单选题]反映某一事件发生强度的指标应选用 [判断题]当试样制备之后 ...

  5. mysql 获取递增id_如何在MySQL中获取下一个自动递增ID?

    MySQL具有AUTO_INCREMENT关键字来执行自动增量.AUTO_INCREMENT的起始值为1,这是默认值.每条新记录将增加1. 要获得MySQL中的下一个自动增量ID,我们可以使用MySQ ...

  6. 【SQL实战经验一】:SQL语句中存在英文的单引号、双引号问题

    SQL语句中存在英文的单引号.双引号问题 场景: 1.需要将 [O'MALL侨城商业中心]插入到Sqlite数据库中 update datatable set name_1 = 'O''MALL侨城商 ...

  7. mysql 删除最后100条_sql-如何回滚我在MySQL中的最后一个删除命令?

    sql-如何回滚我在MySQL中的最后一个删除命令? 我不小心从表中删除了很多行... 如何退回? 我使用PuTTY执行查询. 如果您能安全地指导我,我将不胜感激. 10个解决方案 96 votes ...

  8. mysql中,输入一个日期,动态的获取每周和每月的实时最后一天

    mysql中,输入一个日期,动态的获取每周和每月的实时最后一天 SELECTv.dayStr AS '选定的日期',-- 系统当前日期(SELECTDATE_FORMAT(NOW(), '%Y-%m- ...

  9. .net一个函数要用另一个函数的值_【195期】MySQL中的条件判断函数 CASE WHEN、IF、IFNULL你会用吗?...

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅 阶段汇总集 ...

最新文章

  1. mahout安装测试
  2. OpenCV用ArUco和ChArUco进行校准
  3. 武汉新增职位数同比下降44.25%,这些企业却在猛招人,“来多少,要多少”
  4. python2ide_python_2_IDE安装
  5. sql server2008 如何获取上月、上周、昨天、今天、本周、本月的查询周期(通过存储过程)...
  6. 兄弟连视频教程下载地址汇总-2014
  7. 网络流四种主流算法时间复杂度分析
  8. unity3d利用pano2VR实现全景视图效果
  9. 基、维数和坐标 过渡矩阵与坐标变换
  10. 字体加密网站的抓取以及思路解决
  11. 特斯拉阀:被遗忘的天才之阀
  12. 深度解析 intern 方法
  13. java.io.IOException: Cleartext HTTP traffic to xxx.xxx.xxx.xxx not permitted
  14. 【MOTRIX】使用motrix下载百度云文件
  15. 入侵FBI(www.fbi.gov)核心网络全过程
  16. 这是他本赛季第一张黄牌
  17. ios隐私权限的使用及设置
  18. JZ2440移植uboot
  19. 专利产品被“山寨”热卖 广东商家怒将拼多多告上法庭
  20. 基于web的电子图书管理系统

热门文章

  1. linux内核网络协议栈--linux bridge(十九)
  2. linux内核网络协议栈--数据包的网卡缓冲区(二十四)
  3. flash动画制作成品_Flash制作点燃蛋糕蜡烛的互动动画
  4. 怎么在ASP.NET中写HTML,如何:在 ASP.NET 网页中设置控件的 HTML 属性
  5. [ActiveMQ]初识ActiveMQ
  6. Merge、Rebase
  7. Linux中的MySql数据库远程连接
  8. [转]double free or corruption (!prev): 0x080644c8 ***
  9. 屏幕截图在网页设计中应用的30个优秀案例
  10. 对高性能Web服务的研究笔记