1、在sql语句前使用explain关键字,查看执行情况。
2、正确的建立索引
3、在子查询当中,尽量用exists代替in:select a.id from tbl_glw_customer_order_transport a where exists(select 1 from tbl_glw_customer_order_transport_items b where b.transport_id = a.id);如果一定要用in,包含的值也不要过多。
4、SELECT语句务必指明字段名称,不要用*代替。
5、只查询一条数据的时候,使用limit 1
6、where子句中尽量不要使用is null 或 is not null对字段进行判断,尽可能将某个字段可能为空的时候设置默认值: mysql会自动判断数据的分布情况判断数据中null多,还是not null多,然后决定走不走索引。
7、避免在where子句中对字段进行表达式操作或函数操作:where子句‘=’ 左边不要出现函数、算数运算或者其他表达式运算。
8、对于联合索引来说,要遵守最左前缀法则: 例如组合索引(id,name,gender),在where中使用的时候,可以where id=1 或者where id=1 and name='jack',禁止直接where name='jack',或者where gender='male'会导致联合索引失败,可以在name和gender中单独建立索引。
9、尽量使用inner join,避免left join:如果连接方式是inner join,在没有其他过滤条件的情况下MySQL会自动选择小表作为驱动表,但是left join在驱动表的选择上遵循的是左边驱动右边的原则,即left join左边的表名为驱动表。
10、注意范围查询语句:对于联合索引来说,如果存在范围查询,比如between、>、<等条件时,会造成后面的索引字段失效。解决办法: 业务允许的情况下,使用 >= 或者<= 这样不影响索引的使用。(这个我测试了,不影响的啊)
11、注意通配符中Like的使用,%放在前面会造成全表的扫描,而%放在后面则会使用索引:where name like '邢%'
12、在 where 子句中使用 or 来连接条件,如果or连接的条件有一方没有索引,将导致引擎放弃使用索引而进行全表扫描。解决办法: 将or连接的双方都建立索引,就可以使用。或者使用union、union all。
13、字符串类型的字段查询的时候如果不加单引号''  ,会导致自动进行隐式转换,然后索引失效。(我测试的时候,如果查询的字符串是数字,不加引号会导致索引失效,其他字符串会直接报错的)
14、指定查询的索引,当sql查询的字段有多个索引的时候,mysql优化器会自动选择一个索引进行查询,我们也可以通过sql字段进行自定义
use index(索引): 推荐使用指定的索引 (最终用不用该索引,还需要mysql自己判断):select * from tb1 use index(索引A)
ignore index(索引) : 忽略掉这个索引:select * from tb1 ignore index(索引A)
force index(索引): 强制使用该索引:select * from tb1 force index(索引A)
15.where执行顺序是从左往右执行的,在数据量小的时候不用考虑,但数据量多的时候要考虑条件的先后顺序,此时应遵守一个原则:排除越多的条件放在第一个。
来源:https://blog.csdn.net/wang5701071/article/details/108797859
https://www.cnblogs.com/hgmyz/p/7039597.html
详细:https://www.cnblogs.com/codingmode/p/15561098.html
MySQL大数据量分页性能优化:https://www.cnblogs.com/youyoui/p/7851007.html 和 https://www.cnblogs.com/lpfuture/p/5772055.html
posted on 2022-06-14 14:08  邢帅杰  阅读(75)  评论(0编辑  收藏  举报