mysql 高级
1.索引失效
尽可能减少join语句中的循环总次数;小结果驱动大结果。
全值匹配我最爱。最佳左前缀法则。查询从索引的最前列开始并且不跳过索引中的列。
不在索引列上做任何操作,计算,函数,类型转换,会导致索引失效而转向全表扫描。
存储引擎不能使用索引中范围条件右边的列。
尽量使用覆盖索引,只访问索引的查询。
msql 在使用不等于!=或<>的时候索引会失效。导致全表扫描。
is null,is not null 也无法使用索引。
like 以通配符开头%索引会失效。
字符窜不加单引号索引会失效。
少用or,用它来连接时会索引失效。
2,一般性建议
对于单键索引,尽量选择针对当前query过滤性更好的索引
在选择组合索引的时候,当前query中过滤性最好的字段在索引顺序中,位置越靠前越好。
在选择组合索引的时候,尽量选择可以包含当前query中的where字据中更多字段的索引。
尽可能通过分析统计信息和调整query的写法来达到选择合适索引的目的。
少用hint强制索引。
3,查询优化
永远小表驱动大表,类似嵌套循环。 in 里面小表
order by 子句,尽量使用index方式排序,避免使用filesort方式排序。
支持二种方式的排序,FileSort和Index,Index效率高. 它指MySQL扫描索引本身完成排序。FileSort方式效率较低。
满足两情况,会使用Index方式排序:
语句使用索引最左前列
子句与Order BY子句条件列组合满足索引最左前列
有两种算法: mysql就要启动双路排序和单路排序
优化策略:增大max_length_for_sort_data参数的设置
增大sort_buffer_size参数的设置
为排序使用索引。
msql两种排序方式:文件排序或扫描有序索引排序。
msyql能为排序与查询使用相同的索引。
索引 key a_b_c(a,b,c)
order by 能使用索引最左前缀
如果where使用的索引的最左前缀为常量,则order by 能使用索引。
order by a asc,b desc,c desc 排序不一致不能使用索引进行排序。
order by b,c 丢失a索引,
order by c 丢失b索引
order by a,d d不是索引的一部分
where a in(....) order by b,c 对于排序来说,多个相等条件也是范围查询。
group by 关键字优化。
实质是先排序后进行分组,遵照索引建的最佳左前缀。
where 高于having,能写在where限定的条件就不要去having限定了。
分区:
range分区,
create table tbl_new(
id int not null primary key,
title varchar(20) not null default
)engine myisam charset utf8
partition by range(id)(
partition t0 values less than(10),
partition t1 values less than(20)
)
list 分区 hash分区 key 分区 子分区 对null值得处理

浙公网安备 33010602011771号