索引
最近看mysql高性能,可能是书比较老,感觉有些和想的不一样,所以自己试了试。
-
截取字段建立索引
-
ALTER TABLE ey_l add INDEX DE_O_UUID_UNIQUE (DE_O_UUID(6))
这两种都可以,截取长度要自己把握尽量查出来不重复,这样建可以缩短储存空间。
-
-
索引使用
建立了如上索引,
1. select * FROM ey_l WHERE DE_O_UUID like "3%" or ( DE_O_UUID like "3%" and C_DATE = "2021-12-03 13:48:32") 2. select * FROM ey_l WHERE DE_O_UUID like "3%" and C_DATE = "2021-12-03 13:48:32" 3. select * FROM ey_l WHERE C_DATE = "2021-12-03 13:48:32" and DE_O_UUID like "3%" 4. select * FROM ey_l WHERE DE_O_UUID like "3%" or C_DATE = "2021-12-03 13:48:32" 5. select * FROM ey_l WHERE DE_O_UUID like "3%" and C_DATE > "2021-11-03 13:48:32" 6.select * FROM ey_l WHERE DE_O_UUID is null and C_DATE > "2021-11-03 13:48:32" 7.select * FROM ey_l WHERE DE_O_UUID >"f" and C_DATE > "2021-11-03 13:48:32"
以上那些用到了索引,通过explain发现只有 4 没有用到,应是查c_date要用全表,所以就直接全表,7也用了索引但是有意思的是我 DE_O_UUID >"f"的条件如果是 DE_O_UUID >"a"或者DE_O_UUID >"b"就是全表扫描,可能是mysql做了啥。
结论: 所以,and的时候有能用索引的基本能用到不会看你写的顺序,左匹配啥的。像like,范围查也能用到,函数我不太会,应该大部分也会用索引吧。毕竟你能想可以用,那mysql就做得出来(自我感觉)
连表的时候的on and和where
-
and和where起一样的作用的时候都可以,并且我觉得and更好
1.and是过滤,过滤后连表表的行数会少很多,并且and和where本质上都是使用where删选(可以解释看一下)
参考:https://zhuanlan.zhihu.com/p/77847158
多个join就把前一个结果继续join on。所以and先过滤了更好。 -
on and和where区别
and 就是删选后 能够再执行join,执行join的时候把其他东西加进来
where后面没有join所以加不进来
还有就是上面说的我感觉是这样的区别