如何通过优化sql语句提高数据库查询效率?
网友解答: 谢邀!通过SQL调优提高查询性能最重要的就是对索引的使用,下面是对索引使用的一些总结,希望对你有所帮助。MySQL索引对数据检索的性能至关重要,盲目的增加索引不仅不能带来性能
谢邀!
通过SQL调优提高查询性能最重要的就是对索引的使用,下面是对索引使用的一些总结,希望对你有所帮助。
MySQL索引对数据检索的性能至关重要,盲目的增加索引不仅不能带来性能的提升,反而会消耗更多的额外资源。
索引是用于快速查找记录的一种数据结构。索引就像是数据库中数据的目录,数据库在查询时,首先在索引中找到匹配的值,然后根据这个匹配值找到对应的数据行。
聚簇索引的顺序就是数据的物理存储顺序,索引中数据域存储的就是实际的数据,一个表最多只能有一个聚簇索引,适用于查询多行数据,不适用于频繁修改的列,一般在主键上创建。
非聚簇索引顺序与数据物理排列顺序无关,索引中存储的内容为实际数据的地址,适应于查询单行数据。
普通索引,即平时创建的普通索引。
唯一索引,索引所在的列或列组合的值是全表唯一的。
全文索引,MySQL从3.23.23版开始支持全文索引,它查找的是文中的关键词,而不是直接比较索引中的值。
单列索引,在单列上创建的索引。
组合索引,在多个列上创建的索引。
最左前缀查找:where子句中有a、b、c三个查询条件,创建一个组合索引abc(a,b,c),最左前缀的概念是说以组合索引最左边的列a组合成的查询条件,如(a,b,c)、(a,b)、(a,c),这三种情况的查询条件都会使用abc索引,和where子句中a、b、c出现的顺序没关系,可以是where c=? and b=? and a=?,但(b,c)组合不会使用索引,即where c=? and b=?。
哪些列适合创建索引:
1.经常作为查询条件的列;
2.经常作为排序条件的列;
3.经常作为join条件的列;
4.经常被查询的列。
哪些列不适合创建索引:
1.数据频繁被修改的列,数据被修改,索引需要做相应的修改,消耗资源; 2.区分度不是很高的列,如性别,列值重复性太大,索引效果不是很明显; 3.不是经常被作为查询条件、排序条件、连接条件的列。
经验总结:
1.列上进行函数计算将不会使用索引;
2.对于创建索引的列,避免存储NULL,NULL会使索引更加复杂、效率变低,可以使用NOT NULL进行约束;
3.对于模糊查询like '%abc%',将不会使用索引,而like 'abc%'将会使用索引;
4.对于not in、not exists、!=等负向查询将不会使用索引;
5.每次查询只使用一个索引,如果where条件使用了索引,order by将不再使用索引;
6.对于where子句中有多个查询条件的,单列索引的效率不如复合索引,因为查询每次只能使用一个索引;
7.MySQL只对以下操作符才使用索引:<、<=、=、、=、between、in,但是需要注意in的范围值不要太多;
8.union all可以使用索引,但本身效率不是很高,不建议使用;
9.列上进行类型转换的将不会使用索引;
10.老版本MySQL对OR条件不使用索引,新版本才支持,不建议使用OR。
关于索引的实战经验总结后续还会不断更新,可以关注我的酷米号!
网友解答:通过优化SQL语句,提高数据库查询效率,我总结了有这么几个方面:
减少数据访问看起来像一句废话,少访问数据当然可以提高速度了,减少数据访问有这么几个方法:
创建并正确使用索引
我们经常用到的就是B-TREE索引,我们经常说到的【索引】也指的是【B-TREE索引】。
正确使用索引可以让查询效率翻倍,但是如果使用不正确,也会对效率降低很多,比如这几种情况就会造成索引失效:
不等于操作:<? 、not in('')
进行了运算后的字段:column+1(简单的运算),function(column)(函数)
含前导模糊查询:like '%xxx'
IS NULL
隐式类型转换:column是char类型,但是写成column = 123(右边是另外一种类型)
只通过索引访问数据有些时候,我们只需要访问表中的某几个列的数据,我们可以为这几个字段建立一个组合索引,这样的话只通过索引就可以得到数据,可以较小IO的开销。比如:
select name,gender from users where age='25';
如果这个SQL用的频率很高,那么我们可以建立一个组合索引:
create index index_xxx on users(name,gender,age);
在执行这个sql的时候,数据全部都是通过索引找到的,都不需要访问users表。
优化SQL执行计划执行计划表示SQL在执行时候的算法,有的时候SQL语句很复杂,就需要优化SQL的执行计划去提高SQL的执行效率。
其他可能不和SQL有直接的关系,但确实效率提升很明显,比如:
数据分页处理只返回需要的字段减少交互次数(batch DML)使用绑定变量(可以减少数据库服务器CPU运算)