索引部分
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)