目前我正在创建索引,因为我需要它们用于特定的 sql 查询。但它们开始相互重叠。
有什么规则可以有效地定义它们吗?
例如:
- 如果我有 column1 和 column2 的两个索引,column1、column2 的复合索引是否改进了两列的选择?
- column1 和 column2 的索引与 column2 和 column1 的索引之间有什么区别?
目前我正在创建索引,因为我需要它们用于特定的 sql 查询。但它们开始相互重叠。
有什么规则可以有效地定义它们吗?
例如:
A 和 B 两列的索引也可用作 A 列的索引,但不能用作 B 列的索引。
我不知道索引是否有一个简单的规则,也许只是在查询中查找 where 子句和 order by 语句中涉及的列并评估要使用的列。
请记住,索引对于搜索小子集的大量行有意义。索引也会减慢插入和更新速度,因此请明智地使用它们。如果遇到性能问题,只需简单地索引所有用于 JOIN 的行并添加更多行就足够了。
如果我有 column1 和 column2 的两个索引,column1、column2 的复合索引是否改进了两列的选择?
是的,它确实。必须先合并单独的索引,否则只使用一个索引。
column1 和 column2 的索引与 column2 和 column1 的索引之间有什么区别?
在复合索引中,列的顺序很重要,是的。如果您的查询在 WHERE 子句中只有 column2,则不会使用 (column1, column2) 上的复合索引。
如果您在 (column1, column2) 上有一个复合索引,如果您的查询在 WHERE 子句中只有 column1,也可以使用它。
有关更多信息,请参阅我对索引问题给出的其他答案:
问:如果我有 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 的索引有什么区别?
是的,它会有所作为。这取决于您如何形成查询。
示例如果您在表上有如下索引:
索引名称(姓氏,名字)
“名称索引是对 last_name 和 first_name 列的索引。该索引可用于查询中的查找,这些查询为 last_name 和 first_name 值的组合指定已知范围内的值。它也可用于仅指定 last_name 的查询值,因为该列是索引的最左侧前缀。”
您将获得以下查询的索引优势:
SELECT * FROM test WHERE last_name =' Widenius';
但索引不用于以下查询中的查找:
SELECT * FROM test WHERE first_name ='Michael';
希望这会有所帮助!
问)如果我有 column1 (A) 和 column2 (B) 的两个索引,column1、column2 的复合索引是否改进了两列的选择?
SELECT something from table where A = 1 and B =2
将只使用两个索引之一,但如果您有复合索引 A,B,它将使用它,这应该更快问)column1 和column2 的索引与column2 和column1 的索引有什么区别?
这可能有用
http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html http://stackoverflow.com/questions/1823685/when-should-i-use-a-composite-index