本文共 1104 字,大约阅读时间需要 3 分钟。
索引是MySQL高效获取数据的数据结构。简单来说,索引就像是书的目录,能够加快数据库的查询速度。
事实上,索引是一种数据结构,用于帮助我们在大量数据中快速定位到我们想要查找的数据。虽然索引的目录也很大,但它通常存储在磁盘文件中(可能单独存储在索引文件中,也可能与数据一起存储在数据文件中)。
单列索引只包含单个列,但一个表中可以有多个单列索引。
组合索引是指在表中的多个字段组合上创建的索引。只有在查询条件中使用了这些字段的左边字段时,索引才会被使用。使用组合索引时遵循最左前缀集合。
全文索引只在MyISAM引擎上才能使用,只能在CHAR、VARCHAR、TEXT类型字段上使用。全文索引是指在一堆文字中,通过其中的某个关键字等,就能找到该字段所属的记录行。
索引的数据结构使用的是B+树。B+树之所以被选择而不是二叉查找树、平衡二叉树或B树,是因为它更适合处理大规模数据。
为了降低树的高度,B树将二叉平衡树改造成了多叉树。每个节点存储多个元素,这样树变得矮胖,查询效率更高。例如,存储1000个索引,B树的树高只有2层,就可以存储1百万条数据。
B+树是在B树基础上进一步改造的,区别在于非叶子节点是否存储数据。B+树的非叶子节点只存储键值,叶子节点存储数据,并且叶子节点之间用双向指针连接。
B+树的最底层叶子节点包含了所有的索引项。每次查找都需要检索到叶子节点才能查询到数据。因此,B+树的树高理论上情况下比B树要矮。
在InnoDB存储引擎中,辅助索引查询会导致回表操作,因为辅助索引叶子节点保存的数据不是当前记录的数据而是主键索引。这会消耗性能。避免回表的方法是使用覆盖索引。
例如,用户表的索引如果建立在(name, sex)上,而不是单独的name字段,可以避免回表。
联合索引可以节省空间,并更容易实现索引覆盖。联合索引(a_b_c)的使用比单独的a、a_b、a_b_c三个索引更高效。
在创建联合索引时,应将频繁使用的列和区分度高的列放在前面。如果当前索引存在频繁使用作为返回字段的列,可以考虑将其加入到联合索引中。
通过以上优化,可以显著提高数据库查询性能。
转载地址:http://xadfk.baihongyu.com/