MYSQL 优化(二),持续更新收藏

索引部分

1:联合索引如果能覆盖索引 会省去回表操作 效率大大提高

所以select的字段 尽量只查询联合索引里面的字段

2:只为搜索,排序,分组的字段建立索引

3:列基数过小的 就不需要索引了 效率不高 比如sex性别这种

4:索引列的字段尽量要小 比如tinyint char(8) 这样

索引占用的存储空间就越少,在一个数据页内就可以放下更多的记录,从而减少磁盘I/O带来的性能损耗,也就意味着可以把更多的数据页缓存在内存中,从而加快读写效率

5:对于超长字段 比如name 其中有的字段很长比如“阿里马叉挖啦啦啦啦” 可以只对字符前几个字符进行索引 比如name(10)这样效率比较可观

6:去掉一些冗余索引 

比如 

KEY idx_name_birthday_phone_number (name(10), birthday, phone_number),

KEY idx_name (name(10))

上面的联合索引 已经可以对name进行排序了 下面一个则多余了

7:hash索引一般用于唯一性字段(也不一定非要唯一 但重复性比较高的字段使用hash增删改查性能都不怎么好)的索引比较好 且没范围查询需求,排序需求

比较好的例子就比如微信的openid之类

否则还是b+索引

8:尽量不要使用null列  会导致mysql优化器无法选择最优策略,(null可以是都不相同,也可以是一个值,也可以等于没有值)

9:in查询

(1)Table pullout (子查询中的表上拉)

比如 SELECT * FROM s1 WHERE key2 IN (SELECT key2 FROM s2 WHERE key3 = 'a');

如果key2为s2的唯一索引列 

那么上面查询就等同于一个内连接查询

select * from s1 inner join s2 on s1.key2 =s2.key2 where key3='a'  

这时候mysql优化器就可以使用内连接的优化规则(如选择左连还是右连)还自动优化

所以对我们而言,可以尽量保证in 的查询字段在子查询中是唯一索引列,会极大的提升新能

(2)任意in查询其实都可以转为exsits来尝试 (感觉像mysql优化器的问题)

(3)

 

 

 

 

 

 

posted on 2020-06-29 17:55  转瞬千年  阅读(158)  评论(0编辑  收藏  举报

导航