Mysql优化SQL语句

当Mysql表的数据达到百万级事,普遍的Sql查询效率呈直线下载,而且如果where中的查询条件比较多时,其查询速度无法容忍。如果查询时间高达几十秒,这么高的查询延时,任何用户都会抓狂,因此如何提高SQl语句查询效率,显得十分重要

1. 查询慢的原因
1)没有索引或者没有用到索引(程序设计缺陷)
2)I/O吞吐量小,形成了瓶颈效应,这样的情况改为快速的固态银盘,或者形成一个硬盘矩阵
3)内存不足
4)网络慢
5)锁或者死锁
6)查询语句不好,没有优化

2. 优化sql语句
当表中数据量较大时为了提升查询效率肯定会创建索引,但是若索引没用好就适得其反,mysql索引失效的建议/优化建议

1)全值匹配我最爱:查询条件全部用索引(name,age)
explain select * from user where name=‘xxx’ and age=20;

2) 最佳左前缀法则,(索引的带头字段)带头大哥不能死,中间兄弟不能少
explain select * from user where age=20(索引失效)
exlpain select * from user where name=“xxx”(开启索引)

3)不要在索引列上做任何操作(函数)
explain select * from user where left(name,1)=“xxx”

4)范围条件查询 列上索引失效 不要使用!= 、>、 < 、is not null、is null
explain select * from user age>20

5)不要用*来代替列 (覆盖索引)
explain select name from user where name=“xxx”

6)like匹配导致索引失效,也要必免前置%(使用覆盖索引解决)
explain select name from use where name like “%xxx%”

7)应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描
explain select * from user where name =“xxx” or age=20;

8)使用exists代替in是一个好的选择
select * from user where age exists (…)

9)索引不是越多越好,索引可以提高select效率,但也降低了insert和update的效率(insert和update可能会重建索引),一个表的索引一般不要超过6个

10)若只包含数值信息尽量设计为数字型,尽量不要使用字符型,这会降低查询和连接的性能,并且会增加储存开销

11)尽可能的使用varchar/nvarchar代替char/ncgar,因为可以节省储存空间,其次在相对较小的字段内搜索效率显然要提高

12)避免频繁的创建和删除临时表,以减少系统资源的消耗

13)在创建临时表时,如果一次性插入大量数据,可以使用select into 代替 create
table,避免造成大量log,以提高速度,如果数据量不大,为了缓和系统表的资源,应先create table 然后insert

14)尽量避免大事务操作,提高系统并发能力

猜你喜欢

转载自blog.csdn.net/qq_40836501/article/details/88079121