我正在尝试了解如何使用基本查询正确使用索引。
示例:
我的表'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)
答案 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
值<强>更新强>
对于小表,优化器可以选择使用表扫描而不是索引。
表中的数据越多,* 就越有可能使用索引,尤其是在索引的基数足够高的情况下