MySQL 索引原理以及慢查询优化
本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。 文章主要内容分为四个部分: 第一部分主要从数据结构以及计算机主存、磁盘存取的层面讨论MySQL数据库索引。 第二部分主要讨论MySQL中不同引擎(主要讲解MyISAM和InnoDB)的B-Tree索引对比,包括聚集索引、非聚集索引等话题。 第三部分根据上面的理论基础,讨论MySQL中高性能使用索引的策略。 第四部分根据实际案例分析慢查询以及如何进行优化。 第五部分是标注的参考的文章。 1、索引的数据结构以及算法基础 1.1、索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是一种数据结构。 数据库查询是数据库的主要功能之一,最基本的查询算法是顺序查找(linear search)时间复杂度为O(n),显然在数据量很大时效率很低。优化的查找算法如二分查找(binary search)、二叉树查找(binary tree search)等