整形数字和字符串数字的索引使用情况
2013-08-19 21:42
253 查看
准备语句:
mysql会将数字在整形和字符串之间自动转换!
这样下面两条语句的结果是一样的:
SELECT * FROM ix_test WHERE id_1=1;
SELECT * FROM ix_test WHERE id_1='1';
但是在索引使用情况方面,结果就完全不一样了!第一条不使用索引,第二条使用索引!
两条语句,第一条使用了索引,但是扫描了全表,第二条直接索引到数据,只需要读取一行!
所以,多么坑爹的mysql sql优化器,多么痛的领悟!
得出结论,对于where后面字段类型为字符串的数字,如果用整形去匹配(就是不用引号引上数字),则不能由索引直接命中,需要全部扫描。
特别需要注意!
DROP TABLE ix_test; CREATE TABLE ix_test (id_1 varchar(20) NOT NULL, PRIMARY KEY(id_1)); INSERT INTO ix_test VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11);
mysql会将数字在整形和字符串之间自动转换!
这样下面两条语句的结果是一样的:
SELECT * FROM ix_test WHERE id_1=1;
SELECT * FROM ix_test WHERE id_1='1';
但是在索引使用情况方面,结果就完全不一样了!第一条不使用索引,第二条使用索引!
两条语句,第一条使用了索引,但是扫描了全表,第二条直接索引到数据,只需要读取一行!
mysql> explain select * from ix_test where id_1=1; +----+-------------+---------+-------+---------------+---------+---------+------+------+--------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+---------+-------+---------------+---------+---------+------+------+--------------------------+ | 1 | SIMPLE | ix_test | index | PRIMARY | PRIMARY | 302 | NULL | 11 | Using where; Using index | +----+-------------+---------+-------+---------------+---------+---------+------+------+--------------------------+ 1 row in set (0.00 sec) mysql> explain select * from ix_test where id_1='1'; +----+-------------+---------+-------+---------------+---------+---------+-------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+---------+-------+---------------+---------+---------+-------+------+-------------+ | 1 | SIMPLE | ix_test | const | PRIMARY | PRIMARY | 302 | const | 1 | Using index | +----+-------------+---------+-------+---------------+---------+---------+-------+------+-------------+ 1 row in set (0.01 sec)但是如果将id_1字段变为整形,后面用整形或者是字符串去匹配都可以使用索引,而且索引直接命中!
所以,多么坑爹的mysql sql优化器,多么痛的领悟!
得出结论,对于where后面字段类型为字符串的数字,如果用整形去匹配(就是不用引号引上数字),则不能由索引直接命中,需要全部扫描。
特别需要注意!
相关文章推荐
- 整形数字和字符串数字的索引使用情况
- 测试mysql查询中参数整形和字符串类型错误索引使用情况
- MyBaits中枚举类型——在数据库字段类型为字符串、数字等非枚举类型情况下的使用
- SqlBulkCopy excel 字段映射解决办法二 使用数字索引代替 字段名称 做映射 避免字段中有中文 大小写等情况
- JAVA面试 不使用API情况下,把数字字符串转换成int类型
- 【MFC】将CString类型的十六进制数字,转换成整形(在使用Unicode字符集的情况)
- 不开index monitor的情况下判断索引是否被使用过
- 有一串数字,A、B两个人分别依次从两端取一个数,直到取完所有数,取得和最大者胜利;A、B都使用最优策略的情况下,求A、B最终的和;
- 3.有一字符串,包含数字与字母,编程去除数字。要求:1、要求在原字符串中操作2、使用指针处理
- Oracle 不使用索引,索引失效的几种情况
- 使用sstream读取字符串中的数字(c++)
- C# 使用正则表达式去掉字符串中的数字,或者去掉字符串中的非数字
- 索引不被使用的几种情况
- 使用正则表达式将任意长度的浮点数字的字符串转换成百分数
- C# 使用正则表达式去掉字符串中的数字,或者去掉字符串中的非数字
- 关于两个任意长度的数字相乘的代码设计(不使用BigDecimal的情况下)
- Python不使用int()函数把字符串转换为数字
- 不使用split和replace情况下分割复杂字符串
- mysql如何查看索引使用情况以及优化 - guols0612
- 查看索引使用情况