mysql隐形转换造成索引失效的事故总结

php中文网
发布: 2016-06-07 17:36:37
原创
1612人浏览过

隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误.由于表的字段tu_mdn定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给m

   隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误. 由于表的字段tu_mdn定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给mysql,这样会导致索引失效. 错误的例子:select * from test where tu_mdn=13333333333; 正确的例子:select * from test where tu_mdn='13333333333';

   看一下下面的案例,这个案例是开发过程中经常犯的一个错误,这种索引在大表的查询中是很致命的,直接能把数据库拖死:

mysql> show create table shipping\G;

*************************** 1. row ***************************

      Table: shipping

Create Table: CREATE TABLE `shipping` (

 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,

 `shipping_no` int(11) NOT NULL,

 PRIMARY KEY (`id`),

 UNIQUE KEY `shipping_no` (`shipping_no`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1

1 row in set (0.00 sec)

mysql> explain SELECT  shipping_no FROM `shipping`  WHERE  `shipping_no`  IN (62487941,62653594,62952180,63556576,63684186,99097538006,100433005006,100433006006);

+----+-------------+----------------------+-------+---------------+-------------+---------+------+------+-------------+

| id | select_type | table                | type  | possible_keys | key         | key_len | ref  | rows | Extra       |

+----+-------------+----------------------+-------+---------------+-------------+---------+------+------+-------------+

|  1 | SIMPLE      | shipping             | range | shipping_no   | shipping_no | 4       | NULL |    6 | Using where |

+----+-------------+----------------------+-------+---------------+-------------+---------+------+------+-------------+

1 row in set (0.00 sec)


mysql> explain SELECT  shipping_no  FROM `shipping`  WHERE  (`shipping_no`  IN ('62487941','62653594','62952180','63556576','63684186','99097538006','100433005006','100433006006'));

+----+-------------+----------------------+------+---------------+------+---------+------+----------+-------------+

| id | select_type | table                | type | possible_keys | key  | key_len | ref  | rows     | Extra       |

+----+-------------+----------------------+------+---------------+------+---------+------+----------+-------------+

|  1 | SIMPLE      | shipping             | ALL  | shipping_no   | NULL | NULL    | NULL | 12803696 | Using where |

+----+-------------+----------------------+------+---------------+------+---------+------+----------+-------------+

1 row in set (0.00 sec)

   很蛋疼的东西,希望开发者在开发的时候注意字段不要越界,最主要的是不要使用隐形转换,有些是转换不了的,DBA的同行们注意这种隐形转换带来的危害,,一定要给开发者提供规范。

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
相关标签:
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号