【问题标题】:Order of multi column index and SQL query多列索引顺序和SQL查询
【发布时间】:2011-02-02 19:35:27
【问题描述】:

我发现了两个关于 MySQL 中多列索引顺序的相反说法。 这篇 here 的帖子在 cmets 中有一个 (a, b) 索引也将用于具有 (b = value1 AND a = value2) 的查询。此常见问题解答条目here 说(在底部)正好相反(不会使用索引)。什么是正确的?那么PostgreSQL呢?它的行为方式是否相同?

【问题讨论】:

  • 我不是 mySQL 专家(只是 SQL Server 和一点 Oracle),但那个常见问题解答对我来说看起来非常可疑(全表扫描三个 i> 次因为三个条件在 WHERE?Puuhlease!)。每个像样的 SQL 系统都会使用复合索引来进行这种查询(除非表太小以至于根本不需要使用索引)

标签: sql mysql postgresql indexing


【解决方案1】:

首先让我说,没有灵丹妙药的答案。

并且 (a,b) 复合索引上的索引将用于满足查询(b=value1 和 a=value2)。请注意,在 WHERE 子句中,“b”出现在“a”之前无关,因为查询引擎知道您正在处理 a 和 b。如果选择性不够高,它仍然可能不会使用。

说了这么多

2. [SELECT * FROM buyers WHERE last_name=? AND first_name=? AND zip=?]
can't use the index.

这是我今天找到的令人难以置信的常见问题解答中最重要的。部分正确,只是因为SELECT * 需要回溯到表中,因此复合索引的任何好处都会减半(或进一步最小化)。改为比较这段代码末尾的两个查询

CREATE TABLE buyers(
 buyer_id INT NOT NULL AUTO_INCREMENT,
 first_name CHAR(19) NOT NULL,
 last_name CHAR(19) NOT NULL,
 zip CHAR(5) NOT NULL,
 state_code CHAR(2) NOT NULL,
 PRIMARY KEY (buyer_id)
 );

insert buyers values
(991,'zeshan ','Nadeem ',92082,'CA'),
(992,'Ken ','Marcus ',92082,'CA'),
(993,'Tariq ','Iqbal ',92082,'CA'),
(994,'Tariq ','Iqbal ',92082,'CA'),
(995,'Hasnat ','Ahmad ',92083,'NY'),
(996,'Tariq ','Iqbal ',92082,'DC'),
(997,'Keith ','Worlf ',93083,'NG'),
(998,'Ashley ','Lewis ',92088,'NJ'),
(999,'Tariq ','Mehmood ',99088,'TX');

ALTER TABLE buyers ADD INDEX idx_firstname (first_name);
ALTER TABLE buyers ADD INDEX idx_last_name (last_name);
ALTER TABLE buyers ADD INDEX idx_zip (zip);
ALTER TABLE buyers ADD INDEX idx_flname_zip(first_name,last_name,zip);

在单独的查询中运行它

explain
SELECT first_name,last_name,zip FROM buyers WHERE first_name='Tariq' AND last_name='Iqbal' AND zip=92082;

然后这个

explain
SELECT last_name,first_name,zip FROM buyers WHERE last_name='Iqbal' AND first_name='Tariq' AND zip=92082;

他们将展示相同的计划

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-31
    • 2014-03-27
    • 2011-05-14
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 2023-03-04
    • 2014-01-09
    相关资源
    最近更新 更多