数据库笔记5——索引优化

一、索引优化技巧

A、 复合索引中,范围查找之后的索引会失效(select id from u where a=1 and b>2 and c=3,这条sql语句中,如果有(a,b,c)的复合索引,c的索引失效)

B、 一张表最好不要创建超过5个索引,尽量用复合索引

C、 左连接将索引创建在右表上合适(如果左表也需要筛选条件,左表也要创建索引),右连接将索引创建在左表上合适

D、联表查询时,小表驱动大表

E、  全值匹配我最爱。

F、  最佳左前缀法则,如果索引是多字段的复合索引,要遵守最佳左前缀法则。指的是where语句里从索引的最左前列开始并且不跳过索引中的字段。 口诀:带头大哥不能死,中间兄弟不能断。

G、 不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫 描。

H、索引中范围条件右边的字段会全部失效。 把where语句里范围的查询放最后

I、   尽量使用覆盖索引(只访问索引的查询,索引列和查询列一致),不要SELECT *

J、  MySQL在使用 != 或者 <> 的时候无法使用索引会导致全表扫描。 is null 、 is not null 也无法使用索引。 like 以通配符开头 %abc 索引失效会变成全表扫描,%加右边。

K、 字符串不加单引号索引失效。

L、 少用 or ,用它来连接时会索引失效

 

二、小表驱动大表

A、 In查询

  SELECT * FROM `A` WHERE `id` IN (SELECT `id` FROM `B`)

  IN适合B表比A表数据小的情况

B、 Exists(语法:SELECT....FROM tab WHERE EXISTS(subquery); 该语法可以理解为将主查询的数据,放到子查询中做条件验证,根据验证结果( true 或是 false )来决定主查询的数据结果是否得以保留)

  SELECT * FROM `A` WHERE EXISTS (SELECT 1 FROM `B` WHERE `B`.id = `A`.id)

       此时B表应该比A表数据大

 

三、Order by、group by优化

A、 要排序或者分组的字段建有索引,切满足最左匹配原则。

B、 Group by时先使用where筛选,再用having

C、增大 sort_buffer_size 参数的设置。 增大 max_length_for_sort_data 参数的设置。

 

posted @ 2022-03-15 21:56  暗,伏!  阅读(178)  评论(0编辑  收藏  举报