前语
我们都知道SQL功能调优可以从两个维度去进行优化,一个逻辑查询优化,另一个是物理查询优化。逻辑查询优化便是通过SQL等价变换进步查询功率,直白一点便是说,换一种查询写法实行功率或许更高。物理查询优化则是通过索引和表联接方式等技能来进行优化。当谈到通过索引去优化SQL查询功率,首先我们需求知道创建索引有哪些规矩。
A8站源码交易平台
创建索引有哪些规矩?
创建索引有必定的规矩。当这些规矩出现的时分,我们就可以通过创建索引进步查询功率。A8站源码交易平台
哪些情况下可以创建索引:
1、字段的数值有唯一性的捆绑,比如用户名
索引本身可以起到捆绑的效果,比如唯一索引,主键索引都是可以起到唯一性捆绑的。在数据表中,假设某个字段是唯一性的,就可以直接创建唯一性捆绑,或许主键索引。
2、频频作为 WHERE 查询条件的字段,尤其在数据表大的情况下
3、需求常常 GROUP BY 和ORDER BY 的列
4、UPDATE 、DELETE 的 WHERE 条件列,一般也需求创建索引
5、DISTINCT 字段需求创建索引
做多表JOIN联接操作时,创建索引需求留心以下原则:
联接表的数量尽量不要超过3张,因为每添加一张表就相当于添加了一次嵌套的循环,数量级增长会非常快,严重影响查询的功率
对用于联接的字段创建索引,并且该字段在多张表中的类型有必要共同。A8站源码交易平台
举例:
下面这条SQL运用了JOIN 联接,那么ON 左右两边的字段user_id在product_comment表和在user表中的字段类型有必要共同,而不能一个为int另一个为varchar类型。
SELECT comment_id, comment_text, product_comment.user_id, user_name FROM product_comment JOIN user ON product_comment.user_id = user.user_id
WHERE comment_text = '462eed7ac6e791292a79'
哪些情况下不需求创建索引:
索引不是全能的,有一些情况是不需求创建索引的,比如:
1、WHERE 条件(包括GROUP BY 、ORDER BY)里用不到的字段不需求创建索引,索引的价值是快速定位,假设起不到定位的字段通常是不需求创建索引的。
举例:
SELECT comment_id, product_id, comment_time FROM product_comment WHERE user_id = 41251
1
上面这条SQL是按照user_id来进行检索的,所以不需求对其他字段创建索引,即便这些字段出现在 SELECT 字段中。
2、表记载太少,比如少于1000个,那么是不需求创建索引的。表记载太少,是否创建索引对查询功率的影响并不大。
3、字段中假设有很多重复数据,也不必创建索引,比如性别字段。除此之外还需求考虑数值的散布情况。
4、频频更新的字段不必定要创建索引。因为更新数据的时分,也需求更新索引,假设索引太多,在更新索引的时分也会构成担负,然后影响功率。A8站源码交易平台
什么情况下索引失效
常见的索引失效的比如:
1、假设索引进行了表达式核算,则会失效。
例如:
对comment_id添加了索引,假设SQL实行的过程中对这个字段进行了表达式核算那么索引就会失效。
SELECT comment_id, user_id, comment_text FROM product_comment WHERE comment_id+1 = 900001
2、假设对索引运用函数,也会构成失效。
例如:
对comment_text 字段添加了索引,假设SQL实行的过程中对这个字段进行了substring函数工作,那么索引就会失效。
SELECT comment_id, user_id, comment_text FROM product_comment WHERE SUBSTRING(comment_text, 1,3)='abc'
3、在WHERE 子句中,假设在OR 前的条件列进行了索引,而在 OR 后的条件列没有进行索引,那么索引会失效。
因而只需一个条件列进行了索引是没有意义的,只需有条件列没有进行索引,就会进行全表扫描,因而索引的条件列也会失效。
例如:
SELECT comment_id, user_id, comment_text FROM product_comment WHERE comment_id = 900001 OR comment_text = '462eed7ac6e791292a79'
4、当我们运用LIKE 进行模糊查询的时分,后边不能是 % 。
例如:
这个很好了解,假设一本字典按照字母次序进行排序,我们会从首位开端进行匹配,而不会对中心方位进行匹配,否则索引就失效了。
SELECT comment_id, user_id, comment_text FROM product_comment WHERE comment_text LIKE '%abc'
5、索引列尽量设置为 NOT NULL 捆绑。
这样做的长处是可以更好的运用索引,节省空间,乃至加速SQL的工作。
判别索引列是否为 NOT NULL ,需求走全表扫描,因而最好在规划表的时分就将字段设置为NOT NULL捆绑。
比如可以将INT类型的字段,默认值设置为0。将字符类型的默认值设置为空字符串(’ ')。
6、在运用联合索引的时分要留心最左原则
最左原则便是需求从左到右的运用索引中的字段,一条SQL语句可以只运用联合索引的一部分,但是需求从最左面开端,否则就会失效。A8站源码交易平台
总结
运用好索引可以进步SQL查询的功率。需求留心的是添加索引的数量不是越多越好,索引也是会占有空间的,所以尽或许的扩展索引,而不是新建索引。并且索引数量越多需求保护的本钱也会变大,导致写功率变低。一起我们还需求守时查询运用率低的索引,关于 从未运用过的索引可以进行删去,这样才能让索引在SQL查询中发挥最大价值。A8站源码交易平台