一、索引的优化案例
单表优化
双表优化
- left join 往 右表加索引
- right join 往 左表加索引
straight_join 驱动表(小表驱动大表)
驱动表的概念:mysql中指定了连接条件时,满足查询条件的记录行数少的表为驱动表;如未指定查询条件,则扫描行数少的为驱动表。mysql优化器就是这么粗暴以小表驱动大表的方式来决定执行顺序的。
- STRAIGHT_JOIN只适用于inner join,并不使用与left join,right join。(因为left
join,right join已经代表指定了表的执行顺序) - 尽可能让优化器去判断,因为大部分情况下mysql优化器是比人要聪明的。使用STRAIGHT_JOIN一定要慎重,因为啊部分情况下认为指定的执行顺序并不一定会比优化引擎要靠谱。
三表优化
- 遵循left join 往 右表加索引
t1 left join t2 left join t3 往t2 t3 加索引
索引优化
建立复合索引 (建立了索引 name,age,pos)
create index idx_staffs_nameAgePos on staffs(name,age,pos);
优化口诀:
全值匹配我最爱,最左前缀要遵守
带头大哥不能死,中间兄弟不能断
索引列上少计算,范围之后全失效
like百分写最右,覆盖索引不写星
不等空值还有or,索引失效要少用
varchar引号不可丢,SQL高级也不难
- 全值匹配我最爱: where条件刚好跟建好了索引是一对一对应的
- 最左前缀要遵守: 条件name,age,pos 中的 name 一定要用到索引,否则后面用不到索引
- 带头大哥不能死,中间兄弟不能断: 条件 name,age,pos 中有 name和pos,但是 where条件中没有age,则只用到了name 索引,则pos的用不到索引
- 索引列上少计算: 如果 where 条件 age-1 = 22 ,索引会失效,lower(name) = ‘july’ 使用函数的,索引失效,都会变成全局扫描
- 范围之后全失效
- like百分写最右: where name = ‘xxx%’ 或 name=‘ju_ly’
- 覆盖索引不写星: select id from xxx (用什么取什么)
- 不等空值还有or,索引失效要少用: or 、!= 、 <> 使用会变成全局
- varchar引号不可丢: varchar类型要加引号,否则会变成全局查询