MySQL索引优化

写在前面:html

索引对查询的速度有着相当重要的影响,理解索引也是进行数据库性能调优的起点。考虑以下状况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录。若是没有索引,查询将对整个表进行扫描,最坏的状况下,若是全部数据页都不在内存,须要读取10^4个页面,若是这10^4个页面在磁盘上随机分布,须要进行10^4次I/O,假设磁盘每次I/O时间为10ms(忽略数据传输时间),则总共须要100s(但实际上要好不少不少)。若是对之创建B-Tree索引,则只须要进行log100(10^6)=3次页面读取,最坏状况下耗时30ms。这就是索引带来的效果,不少时候,当你的应用程序进行SQL查询速度很慢时,应该想一想是否能够建索引。数据库

进入正题:
缓存

第二章、索引与优化ide

一、选择索引的数据类型性能

MySQL支持不少数据类型,选择合适的数据类型存储数据对性能有很大的影响。一般来讲,能够遵循如下一些指导原则:优化

(1)越小的数据类型一般更好:越小的数据类型一般在磁盘、内存和CPU缓存中都须要更少的空间,处理起来更快。
(2)简单的数据类型更好:整型数据比起字符,处理开销更小,由于字符串的比较更复杂。在MySQL中,应该用内置的日期和时间数据类型,而不是用字符串来存储时间;以及用整型数据类型存储IP地址。
(3)尽可能避免NULL:应该指定列为NOT NULL,除非你想存储NULL。在MySQL中,含有空值的列很难进行查询优化,由于它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。

1.一、选择标识符
选择合适的标识符是很是重要的。选择时不只应该考虑存储类型,并且应该考虑MySQL是怎样进行运算和比较的。一旦选定数据类型,应该保证全部相关的表都使用相同的数据类型。
(1)    整型:一般是做为标识符的最好选择,由于能够更快的处理,并且能够设置为AUTO_INCREMENT。

(2)    字符串:尽可能避免使用字符串做为标识符,它们消耗更好的空间,处理起来也较慢。并且,一般来讲,字符串都是随机的,因此它们在索引中的位置也是随机的,这会致使页面分裂、随机访问磁盘,聚簇索引分裂(对于使用聚簇索引的存储引擎)。spa

二、索引入门
对于任何DBMS,索引都是进行优化的最主要的因素。对于少许的数据,没有合适的索引影响不是很大,可是,当随着数据量的增长,性能会急剧降低。
若是对多列进行索引(组合索引),列的顺序很是重要,MySQL仅能对索引最左边的前缀进行有效的查找。例如:
假设存在组合索引it1c1c2(c1,c2),查询语句select * from t1 where c1=1 and c2=2可以使用该索引。查询语句select * from t1 where c1=1也可以使用该索引。可是,查询语句select * from t1 where c2=2不可以使用该索引,由于没有组合索引的引导列,即,要想使用c2列进行查找,必需出现c1等于某值。
htm


http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.htmlblog

相关文章
相关标签/搜索