mysql数据库查询优化,该从哪几个方面进行优化?

当mysql数据库中数据越来越多的时候,或许我们会发现查询的效率越来越低了,可能低到令人发指的地步,仅仅查询几条数据就要要十几秒甚至几十秒钟,这是十分致命的,如果用户访问你的网站,十几秒过去了数据都加载不出来,那么造成的用户流失是不可想象的。

于是乎,我们就要分析是什么造成了数据库查询效率低下。
一般来讲,造成这种结果有下面这几个原因:
1,sql语句与索引
2,表结构
3,储存引擎
4,网卡流量
5,服务器硬件
6,磁盘IO

本文中我们主要针对sql与索引进行优化,因为这是成本最低,效果最好的优化方案(当然,如果钱多,升级升级硬件比什么优化都好使)

1,使用表连接代替子查询,首先表连接不会再内存中建立临时表,其次,例如在where中使用子查询,会增加数据查询的次数。

2,在编写sql语句的时候,一定要注意函数、运算符或关键字的用法,因为可能会导致索引失效,导致全表扫描,使查询效率大打折扣。具体可以参考该链接中的文章,有比较详细的解读,我这里就不重复了https://www.cnblogs.com/jett010/p/4826655.html

3,在搜索字符型字段时,我们有时会使用LIKE关键字和通配符,这种做法虽然简单,但却也是以牺牲系统性能为代价的,能不用尽量不用,如果要用,就在有索引的字段上用。

4,避免在查询中让MySQL进行自动类型转换,因为转换过程也会使索引变得不起作用,最好是在相同类型的字段间进行比较的操作。

5,使用union来代替手动创建临时表,它可以把需要使用临时表的两条或更多的select查询合并的一个查询中。在客户端的查询会话结束的时候,临时表会被自动删除,从而保证数据库整齐、高效

6,进行锁定表的操作,事务肯定是mysql中不可缺少的,这是数据安全的基本保障,但是事务机制是对数据库的锁定,这会造成高并发情况下,用户的访问响应延迟,带来不好的用户体验,所以我们可以手动将锁定范围缩小,进行表锁定

LOCK TABLE inventory WRITE SELECT quantity  FROM   inventory   WHERE Item='book';

...

UPDATE   inventory   SET   Quantity=11   WHERE  Item='book';UNLOCKTABLES

7,索引优化,索引应该是mysql提高查询速度最常用的一种办法了,我们应该在哪些字段建立索引呢?
因为场景不同要求也不同,这时候可以查看慢查询日志,选取合适字段建立索引,一般情况下,索引使用原则:
经常被查询的高频字段需要建立索引;
不要在大字段中创建索引,例如text类型的字段;
使用索引之后,查询数量量占总表数据量的3%-5%是最能发挥索引效果的一个范围;
在联合索引中,一定要遵循左前缀元组,否则索引失效。
想知道自己写的sql语句是否用到了索引,可以用explain关键字查看一下

8,切分sql语句,将逻辑复杂,又长关联又多的sql语句拆分成多个单个查询的小的sql语句,这样子既可以让缓存的效率更高,又可以减少锁表锁行的时间

最后借用一句话总结一下sql语句的优化:
首先定位应用程序内哪些sql语句会比较慢,我们可以通过慢查询日志,show profiles ,show processlist, 然后通过explain来查询这条或这些条sql语句为什么会慢,然后进行一系列的优化。
优化,首先从索引着手,然后从数据访问,长难查询语句,以及特定类型的查询语句来进行优化。

你可能感兴趣的:(mysql,查询优化)