mysql索引的详细介绍
所有的MySQL的列类型可以被索引,使用索引的相关栏目是提高选择操作性能的最佳途径。根据每个表的存储引擎的最大指数和最大长度指标的定义,所有的存储引擎支持至少16个指标每桌,至少有256个字节的总指数。大多数存储引擎有较高的限制。
在MySQL 5.1中,MyISAM和InnoDB表前缀可以达到1000字节。请注意,前缀的限制应以字节计量,并在创建表的语句被解释为字符数前缀长度。当前缀长度是使用多字节字符集的列指定的,它是必要的考虑前缀长度。
你也可以创建一个全文索引,索引可以用于全文本搜索。只有MyISAM存储引擎支持全文索引,只为char、varchar、和文本列。指标总是在整体柱和不支持本地(前缀)指标。您还可以创建对空间的柱型指标。只有MyISAM存储引擎支持的空间类型,采用R树空间索引,默认内存(堆)存储引擎使用哈希索引,但是它也支持B树索引。
设计指标原则
1)搜索的索引列不一定是要选择的列。
换句话说,最合适的索引列是WHERE子句中出现的列,或在连接子句中指定的列,而不是SELECT关键字之后的SELECT列表中的列。
2)使用唯一索引。
Consider the distribution of the middle value of a column.For a column with a unique value, the index has the best effect, and a column with multiple repeats has the worst index.For example, the age column has different values and is easy to distinguish between the lines.The columns used to record sex only contain M and F, so indexing this column is not very useful.
3)使用短索引。
如果字符串的索引,你应该指定一个前缀长度,应该做的事,只要它是可能的。例如,如果有一个char(200)列,如果在前10或20个字符是独特的,那么整个柱没有索引。索引前10或20个字符可以节省大量的指数空间,也可以使查询更快,更小的指标涉及较少的磁盘I / O,和较短的值比较快。更重要的是,对于较短的键值,在索引缓存块可以容纳更多的核心价值,所以MySQL也可以容纳更多的价值,这增加了的记忆。不读书的指标多块找到行的可能性。(当然,我们应该利用一些常识。这是不可能的索引与列值的第一个字符,因为索引中没有很多不同的值。
4)使用最左前缀。
创建一个n列的索引时,它实际上是一个指标,可对MySQL的创作。多列索引可以因为套在索引列的最左端可以用于匹配的行数指标发挥作用。这样的集合称为(最左前缀。这是不同于一个索引列的前缀索引列的前缀是用前n个字符的索引的索引值。)
5)不要过度索引。
不要认为越多越好的指数,该指数是错误的。每个额外的索引占用额外的磁盘空间,并降低写操作的性能,我们已经介绍了。当一个表的内容被修改,索引必须更新,有时可能需要重构,因此更多的指标,它不再需要。如果一个指标是很少使用或不使用,它不需要放慢速度表的变化速度。此外,它需要时间来考虑各种指标当MySQL生成执行计划。创建冗余指标带来了更多的工作,太多的索引查询优化。不可能让MySQL选择最好的指标使用。只有保持必要的指标是有益的To查询优化。如果要在索引表中添加索引,则应考虑添加的索引是否是现有多列索引的最左索引。如果是,不要费心增加索引,因为它已经有了索引。
6)考虑列上进行比较的类型。
该指标可用于=、>和操作。当模式有直接的前缀,该指数也用在像操作。如果只有一列是用于其他类型的操作,如strcmp(),它是不是有价值的指标。
B树索引和哈希索引
对于B树和哈希索引,当使用=,,为空或不空算子,关键元素和常量值的比较关系对应于一系列条件。有了哈希索引的另外一些特点:他们仅用于=或算子的等式(但很快),优化器不能使用哈希索引加快了运行秩序。(这类指标不能用于搜索其次录入)。MySQL不知道多少行两个值之间(这是用来确定哪些指标是由范围优化器使用)。如果你改变MyISAM表的哈希索引的存储表,会影响一些查询。整个关键字只能用于搜索线。(与B树索引,LEftmost前缀任何关键字可以用来找到一行)。
For BTREE index, when using >, =, or LIKE'pattern'(where'pattern' does not start with wildcards) operator, the comparison relation between key elements and constant values corresponds to a range condition.Constant values refer to the constants in the query string, the columns in const or system tables in the same connection, the results of irrelevant sub queries, and the expressions which are composed entirely of the preceding subexpressions.
以下是WHERE子句中范围条件查询的示例。
下列范围查询适合B树索引和哈希索引:
复制代码代码如下:SELECT * FROM T1,key_col = 1或key_col在(15,18,20);
下列范围查询适用于btree索引
复制代码代码如下:SELECT * FROM T1,key_col > 1和key_col<10;
SELECT * FROM T1,key_col like'ab %或key_col between'bar;
MySQL如何使用索引
索引用于快速找到线已列中的特定值,而不使用索引,MySQL必须从第一个记录开始读完整的表格到相关线路,表面积较大,它的时间就越长。如果表中查询列表中有一个索引,MySQL可以迅速达到一个要搜索的数据文件中的位置,也不需要看到所有的数据。如果一个表有1000行,它比顺序读至少快100倍。注意,如果你需要访问一个大的分支,顺序读快得多,因为在这一点上我们避免磁盘搜索。
大多数的MySQL索引(主键、唯一、指数和全文)存储在B树,R树用于空间列类型的指数,和内存表还支持哈希索引。
让我们看看数据库将使用什么条件索引,以及在什么情况下数据库将不使用索引来详细解释。请参阅优化章节的相关章节,这里不再疲倦。