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值得处理



posted @ 2017-08-29 16:21  海尚书  阅读(78)  评论(0)    收藏  举报