避免在sql的where中对字段进行转换(函数转换/操作符转换/隐式转换)------索引会失效从而导致慢查询
2017-11-20 22:20
796 查看
看例子:
可见, score是索引, 我们继续看:
可以看到, 时间差距较大, 为什么呢? 因为对sql的where字段进行转换(函数转换/操作符转换/隐式转换), 会导致索引失效。来explain看看:
看type, 很显然, 后者进行了全表搜索, 也就是索引失效了。 看看 key和rows也能获知结果。
要避免, 杜绝。
mysql> show create table tb_test; +---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | tb_test | CREATE TABLE `tb_test` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'test', `name` varchar(32) NOT NULL COMMENT 'test', `score` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'test', PRIMARY KEY (`id`), KEY `id_score` (`score`) ) ENGINE=InnoDB AUTO_INCREMENT=10005 DEFAULT CHARSET=utf8 COMMENT='测试表, 无实际作用' | +---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
可见, score是索引, 我们继续看:
mysql> select * from tb_test where score = 1; +----+------+-------+ | id | name | score | +----+------+-------+ | 1 | n1 | 1 | +----+------+-------+ 1 row in set (0.00 sec) mysql> select * from tb_test where score + 1 = 2; +----+------+-------+ | id | name | score | +----+------+-------+ | 1 | n1 | 1 | +----+------+-------+ 1 row in set (0.00 sec) mysql> mysql> mysql> show profiles; +----------+------------+---------------------------------------------------+ | Query_ID | Duration | Query | +----------+------------+---------------------------------------------------+ | 10061 | 0.00076248 | select * from tb_test where score = 1 | | 10062 | 0.00316482 | select * from tb_test where score + 1 = 2 | +----------+------------+---------------------------------------------------+ 15 rows in set (0.00 sec)
可以看到, 时间差距较大, 为什么呢? 因为对sql的where字段进行转换(函数转换/操作符转换/隐式转换), 会导致索引失效。来explain看看:
mysql> explain select * from tb_test where score = 1; +------+-------------+---------+------+---------------+----------+---------+-------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +------+-------------+---------+------+---------------+----------+---------+-------+------+-------+ | 1 | SIMPLE | tb_test | ref | id_score | id_score | 4 | const | 1 | | +------+-------------+---------+------+---------------+----------+---------+-------+------+-------+ 1 row in set (0.00 sec) mysql> explain select * from tb_test where score + 1 = 2; +------+-------------+---------+------+---------------+------+---------+------+-------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +------+-------------+---------+------+---------------+------+---------+------+-------+-------------+ | 1 | SIMPLE | tb_test | ALL | NULL | NULL | NULL | NULL | 10224 | Using where | +------+-------------+---------+------+---------------+------+---------+------+-------+-------------+ 1 row in set (0.01 sec)
看type, 很显然, 后者进行了全表搜索, 也就是索引失效了。 看看 key和rows也能获知结果。
要避免, 杜绝。
相关文章推荐
- SQL中一些不经意隐式类型转换或者函数使用导致索引失效问题
- mybatis查询sql:where语句“查询时间字段书写问题”引发的索引失效
- Oracle优化你的查询--关于避免索引隐式失效
- sql查询调优之where条件排序字段以及limit使用索引的奥秘
- 由于mysql隐式类型转换导致的索引失效的问题
- 隐式转换导致索引失效
- sql查询调优之where条件排序字段以及limit使用索引的奥秘
- 关联字段字符集相同,但是校验规则不一样,导致表关联时做隐式转换,无法用到关联字段上的索引
- SQL 两表关联查询 where 条件中等号两端字段顺序对效率的影响
- 在SQL-SERVER2000中对同一个数据库多张表进行查询时怎样避免笛卡儿乘积???
- Where语句设置不当导致索引失效
- 隐式转换引起的sql慢查询实战记录
- Where语句设置不当导致索引失效
- SQL优化避免索引失效
- oralce 提高查询效率 给条件字段添加索引 sql
- 拼音字母进行SQL查询指定字段的实现
- 一个表里有多个字段需要同时使用字典表进行关联显示,如何写sql查询语句
- SqlBulkCopy excel 字段映射解决办法二 使用数字索引代替 字段名称 做映射 避免字段中有中文 大小写等情况
- SQL优化避免索引失效
- 数据库组件 Hxj.Data (二十八)(事务中的查询,查询字段字中的子查询,WhereClip的隐式转换)