通过简单的选择查询来理解索引

时间:2012-01-17 12:30:18

标签: mysql sql indexing query-optimization

我正在尝试了解如何使用基本查询正确使用索引。

示例:

我的表'testme'包含以下列:

id int primary key
username varchar(20)
data1 int
data2 int
data3 int
data_order int

如果我这样做

select username,data1,data2 from testme where data3=5 order by data_order;

我可以使用哪种索引来加快查询速度?

我尝试在clumns data3和data_order上添加一个索引,但是对该查询的'explain'结果显示它不使用该索引。

更新:  使用mysql cluster(ndb)

3 个答案:

答案 0 :(得分:2)

对于这个特定的查询,有两个索引可以帮助 -

数据索引3(哈希,如果你确定只有查询data3等于某些东西,否则使用btree)和index on data_order(btree)

编辑:在这种情况下,单独的索引更好,因为AFAIK mysql并不总是在where和order语句中搜索复合索引,而另一个问题是,以后你不能只使用这个索引的命令(索引将用于data3 + data_order或仅作为mysql从最左列读取索引的data3)

答案 1 :(得分:2)

将指数视为两件事...... 1.数据存储的顺序
2.查找特定数据(如图书索引)的快速方法

在您的示例中,在(data3, data_order)上设置索引可以很容易地找到您想要的数据,并且已经按正确的顺序排列。

搜索索引后仍需要转到表格,以获取字段username, data1, data2。因此,您也可以在索引中include。这使得索引更大,使用更多空间和更多努力来更新。但是这个成本意味着索引没有加入到表中。它只是阅读索引。

答案 2 :(得分:1)

案例的最佳索引(实际上取决于日期3的表格大小和基数):

CREATE INDEX yourindex ON yourtable(Data3, Data_order)
INCLUDE(username, data1, data2)

或者如果mysql不支持包含列

CREATE INDEX yourindex ON yourtable(Data3, Data_order, username, data1, data2)

为什么最好?

  • 按直接date3
  • 过滤
  • data_order
  • 排序
  • 包括选择列表所需的全部内容(覆盖索引)(如果mysql支持包括列)

<强>更新

对于表,优化器可以选择使用表扫描而不是索引。

表中的数据越多,* 就越有可能使用索引,尤其是在索引的基数足够高的情况下