本篇文章主要介绍了" MySQL性能优化——易实现的MySQL优化方案汇总",主要涉及到方面的内容,对于MySql感兴趣的同学可以参考一下:
一、索引优化(有关索引详解可参看博客http://blog.csdn.net/zhangliangzi/article/details/51366345)1、合...
一、索引优化(有关索引详解可参看博客http://blog.csdn.net/zhangliangzi/article/details/51366345)
1、合理使用索引,在经常查询而不经常增删改操作的字段加索引,一个表上的索引不应该超过6个。
2、Order by与group by后应直接使用字段,而且字段应该是索引字段。
3、索引字段长度应较短而长度固定。
4、索引字段重复不能过多。
5、Hash索引与BTree索引区别(MyISAM与InnoDB不支持Hash索引)
(1)、BTree索引使用多路搜索树的数据结构,可以减少定位的中间过程;综合效率较高,默认使用的索引。
(2)、Hash索引使用Hash算法构建索引;精确的等值查询一次定位,效率极高,但特别不适合范围查询;使用Hash的复合索引是把复合索引键共同计算hash值,故不能单独使用。
6、会导致引擎放弃使用索引,改为进行全表的几种情况,都要在开发中尽量避免出现!
(1)、where子句中使用like关键字时,前置百分号会导致索引失效(起始字符不确定都会失效)。如:select id from test where name like "%吉坤"。
(2)、where子句中使用is null或is not null时,因为null值会被自动从索引中排除,索引一般不会建立在有空值的列上。
(3)、where子句中使用or关键字时,or左右字段如果存在一个没有索引,有索引字段也会失效;而且即使都有索引,因为二者的索引存储顺序并不一致,效率还不如顺序全表扫描,这时引擎有可能放弃使用索引,所以要慎用or。
(4)、where子句中使用in或not in关键字时,会导致全表扫描,能使用exists或between and替代就不使用in。
(5)、where子句中使用!=操作符时,将放弃使用索引,因为范围不确定,使用索引效率不高,会被引擎自动改为全表扫描;
(6)、where子句中应尽量避免对索引字段操作(表达式操作或函数操作),比如select id from test where num/2 = 100应改为num = 200。
(7)、在使用复合索引时,查询时必须使用到索引的第一个字段,否则索引失效;并且应尽量让字段顺序与索引顺序一致。
(8)、查询时必须使用正确的数据类型。数据库包含了自动了类型转换,比如纯数字赋值给字符串字段时可以被自动转换,但如果查询时不加引号查询,会导致引擎忽略索引。
二、表结构优化
1、设计符合第三范式的表结构。
2、尽量使用数字型字段,提高数据比对效率。