mysql 隐式转换 索引_MySQL SQL优化之字符串索引隐式转换
之前有用户很不解:SQL语句非常简单,就是select * from test_1 where user_id=1 这种类型,而且user_id上已经建立索引了,怎么还是查询很慢?
test_1的表结构:
CREATE TABLE `test_1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` varchar(30) NOT NULL,
`name` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
查看执行计划,可以看出进行了全表扫描,并没有用上user_id的索引。
mysql> explain select * from test_1 where user_id=1;
+----+-------------+--------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | test_1 | ALL | idx_user_id | NULL | NULL | NULL | 3 | Using where |
+----+-------------+--------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.01 sec)
仔细看下表结构,user_id的字段类型: `user_id` varchar(30) NOT NULL,
而用户传入的是int,这里会有一个隐式转换的问题。隐式转换会导致全表扫描。
把输入改成字符串类型,执行计划如下,这样就会很快了。
mysql> explain select * from test_1 where user_id='1';
+----+-------------+--------+------+---------------+-------------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+------+---------------+-------------+---------+-------+------+-------------+
| 1 | SIMPLE | test_1 |ref | idx_user_id | idx_user_id | 92 | const | 1 | Using where |
+----+-------------+--------+------+---------------+-------------+---------+-------+------+-------------+
1 row in set (0.00 sec)
此外,还需要注意的是:
数字类型的0001等价于1
字符串的0001和1不等价
mysql> select * from test_1;
+----+---------+------+
| id | user_id | name |
+----+---------+------+
| 1 | 0001 | kate |
| 2 | 1101 | Jim |
| 3 | 1 | Jim |
+----+---------+------+
3 rows in set (0.01 sec)
mysql> select * from test_1 where user_id=1;
+----+---------+------+
| id | user_id | name |
+----+---------+------+
| 1 | 0001 | kate |
| 3 | 1 | Jim |
+----+---------+------+
2 rows in set (0.00 sec)
mysql> select * from test_1 where user_id='1';
+----+---------+------+
| id | user_id | name |
+----+---------+------+
| 3 | 1 | Jim |
+----+---------+------+
1 row in set (0.00 sec)
如果表定义的是int字段,传入的是字符串,则不会发生隐式转换。
看下面的测试:
CREATE TABLE `test_2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`name` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
mysql> explain select * from test_2 where user_id=1;
+----+-------------+--------+------+---------------+-------------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+------+---------------+-------------+---------+-------+------+-------+
| 1 | SIMPLE | test_2 | ref | idx_user_id | idx_user_id | 4 | const | 2 | |
+----+-------------+--------+------+---------------+-------------+---------+-------+------+-------+
1 row in set (0.00 sec)
mysql> explain select * from test_2 where user_id='1';
+----+-------------+--------+------+---------------+-------------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+------+---------------+-------------+---------+-------+------+-------+
| 1 | SIMPLE | test_2 | ref | idx_user_id | idx_user_id | 4 | const | 2 | |
+----+-------------+--------+------+---------------+-------------+---------+-------+------+-------+
1 row in set (0.00 sec)
mysql 隐式转换 索引_MySQL SQL优化之字符串索引隐式转换相关推荐
- mysql 去掉复合索引_MySQL性能优化[实践篇]-复合索引实例
上篇文章最后提了个问题 假设某个表有一个**复合索引(c1,c2,c3,c4)**,问以下查询中只能使用该复合索引的c1,c2,c3部分的有那些 1. where c1=x and c2=x and ...
- mysql添加二级索引的sql语句_MySQL面试知识点追命连环问(二)事务、索引及SQL优化...
目录 上次我们讨论了MySQL的运行流程及原理,字段设计,存储引擎和查询缓存. 这次我们继续来追命连环问关于事务,索引,SQL优化等相关的内容.准备好了吗?事务 索引 SQL优化 常见问题 1. M ...
- 【数据库】第三章 事务、索引和SQL优化
[数据库]第三章 事务.索引和SQL优化 文章目录 [数据库]第三章 事务.索引和SQL优化 一.事务 1.原子性 2.持久性 3.隔离性 4.一致性 二.索引 1.介绍 2.分类 3.底层实现 4. ...
- MySQL02--高级(BTreeB+Tree、聚簇索引非聚簇索引、性能分析(Explain)、索引、sql优化)
1.MySQL架构 2.sql 执行顺序: FROM <LEFT_TABLE> ON <JOIN_CONDITION> <JOIN_TYPR> JOIN <R ...
- SQL优化一键命中索引
Mysql中有哪些索引和各自的用处想必大家都很清楚了吧! 项目开发中sql大家经常用到,表的索引也是,这些sql的运行性能是怎样的你知道么?中索引啦没?命中哪个索引?索引中有哪些是无效索引? 哪些会走 ...
- SQL优化之组合索引中字段的顺序
SQL优化之组合索引中字段的顺序 记一次SQL优化:组合索引中字段顺序有讲究,越离散的字段越靠前,哪个列可以降低索引扫描成本放在前面. Refer:https://blog.csdn.net/pan_ ...
- 查询没有走索引_MySQL 如何正确的使用索引
学习索引,主要是写出更快的sql,当我们写sql的时候,需要明确的知道sql为什么会走索引?为什么有些sql不走索引?sql会走那些索引,为什么会这么走?我们需要了解其原理,了解内部具体过程,这样使用 ...
- 将Json转换过来的带T的字符串格式的时间转换成正常时间,并通过指定格式输出
java中时间接受Json转换时间格式很讨厌,因为json转换的时间带有"T",导致转换时间出错.我提供了下面方法可以转换时间并传出指定格式时间: /*** 将Json转换过来的带 ...
- datetime 索引_MySQL 性能优化:MySQL 中的隐式转换造成的索引失效
数据库优化是一个任重而道远的任务,想要做优化必须深入理解数据库的各种特性.在开发过程中我们经常会遇到一些原因很简单但造成的后果却很严重的疑难杂症,这类问题往往还不容易定位,排查费时费力最后发现是一个很 ...
最新文章
- 使用Docker搭建svn服务器教程
- Gut Microbes l 锻炼或会增加机体内源性大麻素水平和改变肠道菌群从而降低机体慢性炎症!...
- 如何在运行时使用SAP Commerce Cloud backoffice直接给类型增添新属性
- Exceptionless服务端+kibana部署实时日志纪要
- ROS在编译生成自定义消息时报错ModuleNotFoundError: No module named 'em'
- 2018年Android面试题整理
- 自动化测试pytest测试框架实例
- python3入门代码-Python3入门(十三)——连接数据库
- js系列教程7-DOM操作全解
- ROST CM使用方法
- ar电力远程巡检可视化系统强化员工现场作业能力
- echar 常用单词
- 关于ubuntu20.04通过Software and updates安装NVIDIA驱动
- 易基因-【直播预告】国自然热门选题 - 博士后带你了解m6A RNA甲基化
- RabbitMQ教程(安装与使用详解,Spring集成)
- 打开dbf时自动打开fxp_打开游戏时提示缺少必要组件打不开怎么办?
- PCIe5.0的Add-in-Card(AIC)金手指layout建议(一)
- Leetcode 电话号码的字母组合
- MacOS任意降级(完美教程)
- HDU4745 Two Rabbits【区间DP】
热门文章
- vue3遇到问题整理(不定期更新)
- Unity之在UI界面上显示3D模型
- Vue3通透教程【十四】TS复杂类型详解(一)
- 2018-2019 ACM-ICPC, Asia East Continent FinalsGym 102056F	Interstellar … Fantasy(计算几何)
- 打印四年级计算机,(完整版)四年级上下册数学公式汇总,电子版打印给孩子背!...
- React实现全局组件的Toast轻提示效果
- 在Windows 7的Windows Virtual PC上安装Ubuntu 10.4 LTS
- db2安装完成之后如何创建db2的SAMPLE数据库
- 框架设计之菜鸟漫漫江湖路系列 二:自学求索
- 白色运动鞋保养完全攻略