Mysql有效索引

Posted

技术标签:

【中文标题】Mysql有效索引【英文标题】:Mysql effective indexes 【发布时间】:2012-10-23 01:15:25 【问题描述】:

目前我正在创建索引,因为我需要它们用于特定的 sql 查询。 但它们开始相互重叠。

有什么规则可以有效地定义它们吗?

例如:

如果我有 column1 和 column2 的两个索引,column1、column2 的复合索引是否改进了两列的选择? column1 和column2 的索引与column2 和column1 的索引有什么区别?

【问题讨论】:

【参考方案1】:

Q)如果我有 column1 (A) 和 column2 (B) 的两个索引,column1、column2 的复合索引是否改进了两列的选择?

是的,如果您只有两个索引 A 和 B,SELECT something from table where A = 1 and B =2 将只使用两个索引之一,但如果您有复合索引 A、B,它将使用它,这应该会更快

Q) column1 和 column2 的索引与 column2 和 column1 的索引有什么区别?

序列在复合索引中很重要。假设您有与上面相同的查询,并且您的表有 100 万个条目,其中只有 50 个匹配 A=1,10000 个匹配 B=1,那么复合索引 A,B 的性能将比 B,A 好得多。因此,您需要选择具有最小基数的索引的第一个元素。

这可能有用

http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html http://***.com/questions/1823685/when-should-i-use-a-composite-index

【讨论】:

【参考方案2】:

问:如果我有 column1 和 column2 的两个索引,column1、column2 的复合索引是否改进了两列的选择?

是的,那么复合索引更好。

来自Mysql

"mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;

如果 col1 和 col2 上存在多列索引,则可以直接获取相应的行。如果 col1 和 col2 上存在单独的单列索引,则优化器会尝试使用索引合并优化(请参阅第 8.3.1.4 节,“索引合并优化”),或者通过确定哪个索引排除更多行来尝试找到最严格的索引并使用该索引来获取行。”

问:column1 和column2 的索引与column2 和column1 的索引有什么区别?

是的,它会有所作为。这取决于您如何形成查询。

From the Mysql docs:

例如,如果您在表上有如下索引:

索引名称(姓氏,名字)

“名称索引是对 last_name 和 first_name 列的索引。该索引可用于查询中的查找,这些查询为 last_name 和 first_name 值的组合指定已知范围内的值。它也可用于指定只是一个 last_name 值,因为该列是索引的最左侧前缀。”

您将获得以下查询的索引优势:

SELECT * FROM test WHERE last_name='Widenius';

但索引不用于以下查询中的查找:

SELECT * FROM test WHERE first_name='Michael';

希望这会有所帮助!

【讨论】:

【参考方案3】:

如果我有 column1 和 column2 的两个索引,column1、column2 的复合索引是否改进了两列的选择?

是的,确实如此。必须先合并单独的索引,否则只使用一个索引。

column1 和column2 的索引与column2 和column1 的索引有什么区别?

在复合索引中,列的顺序很重要,是的。如果您的查询在 WHERE 子句中只有 column2,则不会使用 (column1, column2) 上的复合索引。

如果您在 (column1, column2) 上有一个复合索引,如果您的查询在 WHERE 子句中只有 column1,也可以使用它。

有关更多信息,请参阅我对索引问题的其他回答:

MYSQL Long super-keys

MySQL query optimization of LIKE term% ORDER BY int

【讨论】:

【参考方案4】:

A 和 B 两列的索引也可用作 A 列的索引,但不能用作 B 列的索引。

我不知道是否有一个简单的索引规则,也许只是在查询中查找 where 子句和 order by 语句中涉及的列并评估使用哪个。

请记住,索引对于您搜索小子集的大量行有意义。索引也会减慢插入和更新速度,因此请明智地使用它们。如果遇到性能问题,只需简单地索引所有用于 JOIN 的行并添加更多行就足够了。

【讨论】:

以上是关于Mysql有效索引的主要内容,如果未能解决你的问题,请参考以下文章

如何让Oracle表的索引暂时失效?然后恢复有效

MySQL索引的使用

MySQL(Innodb)索引的原理

MySQL(Innodb)索引的原理

MySQL(Innodb)索引的原理

原创MySQL(Innodb)索引的原理