慢SQL语句执行分析
案例中的两张表
1 | CREATE TABLE `tradelog` ( |
条件字段函数操作
使用上索引但还是执行很慢
1 | -- 命中索引,但走全索引扫描 |
优化器权衡后依然选择了走索引(t_modified),但是这个索引没有办法通过树搜索功能快速定位,只能全索引扫描(遍历索引树)。无法利用树搜索【原因:在树的根节点就不知道要前往哪个子节点,所以只能全量遍历叶子节点】
正确写法
1 | -- 命中索引 |
使用索引且利用上树搜索
隐式类型转换
1 | -- tradeid为varchar类型,入参为int类型 |
因为tradeid为varchar类型,而我们的入参是int类型,此时会做一个字符串类型转换的操作
那么varchar类型和int类型匹配时,他们的转换规则是什么呢?【结论:字符串和数字做比较的话,是将字符串转换成数字】
1 | select "10" > 9; |
那么,当类型转换发生在参数上的时候,又会命中索引
1 | select * from tradelog where id = "1"; |
补充一个情况,假如我们的字符串中含有不能转换为int的内容,此时会如何转换
1 | SELECT CAST("10a" AS UNSIGNED INT); -- 结果是10 |
字符串转数字是从最左侧开始识别数字,直到碰到不是数字或者到最后截止,将识别出来是数字的字符串转为数字
再补充一个sql注入的例子
1 | select * from tradelog where tradeid = 0; |
隐式字符编码转换
1 | select d.* from tradelog l, trade_detail d where d.tradeid=l.tradeid and l.id=2; |
1 | explain select l.operator from tradelog l , trade_detail d where d.tradeid=l.tradeid and d.id=4; |
写在最后,1024节日快乐!
- Post title:慢SQL语句执行分析
- Post author:大黄
- Create time:2023-10-24 11:34:59
- Post link:https://huangbangjing.cn/2023/10/24/慢SQL语句执行分析/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.