赞
踩
mysql 使用的是(Balance+ Tree,也就是平衡树)B+树,在B树的基础上做了优化,B+ Tree 是基于 B Tree 和叶子节点顺序访问指针进行实现,它具有 B Tree 的平衡性,并且通过顺序访问指针来提高区间查询的性能。
树的查询速度是取决于树的高度,一般的树,如红黑树每个节点挂了2个子叶,mysql为了提供性能在每个节点下挂了更多子叶,这样可以减少IO的次数.
为了减少磁盘 I/O,磁盘往往不是严格按需读取,而是每次都会预读。预读过程中,磁盘进行顺序读取,顺序读取不需要进行磁盘寻道,并且只需要很短的旋转时间,速度会非常快。
操作系统一般将内存和磁盘分割成固态大小的块,每一块称为一页,内存与磁盘以页为单位交换数据。数据库系统将索引的一个节点的大小设置为页的大小,使得一次 I/O 就能完全载入一个节点。并且可以利用预读特性,相邻的节点也能够被预先载入.
mysql默认使用的是InnoDB.
InnoDB 的 B+Tree 索引分为主索引和辅助索引。主索引的叶子节点 data 域记录着完整的数据记录,这种索引方式被称为聚簇索引(聚簇索引是将数据和索引放在一起,这样可以让查询的速度更快)。
当然还有另一种索引,哈希索引.
使用InnoDB的基本所有查询的时间复杂度是O(lg n),包含grup by,order by.
哈希索引的单点查询时间复杂度是O(1),如果是grup by,order by是O(n).
MyISAM支持全文索引,而InnoDB也是在 MySQL 5.6.4 版本中也开始支持全文索引.
MyISAM 存储引擎支持空间数据索引(R-Tree),可以用于地理数据存储。空间数据索引会从所有维度来索引数据,可以有效地使用任意维度来进行组合查询。必须使用 GIS 相关的函数来维护数据。
1.索引支持单列索引和多列多列索引,在索引的选用中一般会要选择散列度高.
2.在多列索引中,一般要将散列度(选择度)高的索引放在前面,这样性能更好.
3.对应要储存字符串的列(varchar,text..)加索引时要添加前缀索引.
4.覆盖索引,即索引中包含where条件要查的值.好处是减少了大量的访问,毕竟索引通常远小于数据行的大小,只读取索引能大大减少数据访问量。在innoDB中索引中包含对应的值,可以不用访问主键(主索引).
5.索引的最左前缀原则
例如建立一个索引对应的列是:column1,column2,column3
在实际中是产生了三个索引:(column1),(column1,column2),(column1,column2,column3),所以建议最左边的这个column1要是用散列度高的列可以提高查询的性能,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。