首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单列索引与多列索引

单列索引与多列索引
EN

Stack Overflow用户
提问于 2018-02-16 10:58:30
回答 2查看 38关注 0票数 0

我必须在一个包含大约2000万行的大型表上运行两个简单的查询。

表列是id|user_id|earned_amount|created_at

查询1:

代码语言:javascript
复制
select user_id, sum(earned_amount) as total_earning 
from earning_history 
where user_id=XX;

查询2:

代码语言:javascript
复制
SELECT date(created_at) date, sum(earned_amount) as earning, count(id) as total_entry 
FROM `earning_history` 
where user_id=xx 
GROUP by date

我必须运行第二个查询而不是第一个查询。因此,我想索引user_idcreated_at列;

在没有索引的情况下,执行第二个查询大约需要6-7秒。我的问题是,

  1. 我应该只索引user_id列吗?或者我应该同时索引user_idcreated_at列?
  2. 我应该使用像=> ALTER TABLE earning_history ADD INDEX (user_id, created_at);这样的多列索引吗?
EN

回答 2

Stack Overflow用户

发布于 2018-02-16 11:12:08

可以使用复合索引来快速访问数据,并减少对数据检索值的访问。可以将列用于where (user_id)和select中使用的列。

但对于函数或计算列中的列,通常使用索引。

总之,你应该有一些好处,使用和索引

代码语言:javascript
复制
create index my_index  on my_table ( user_id, id, created_at, earned_amount)

代码语言:javascript
复制
create index my_index  on my_table ( user_id,  created_at,id, earned_amount)
票数 0
EN

Stack Overflow用户

发布于 2018-02-27 17:21:17

除非id可以是NULL,否则说COUNT(*)而不是id。那么,这两个查询的最佳索引是以下顺序

代码语言:javascript
复制
INDEX(user_id, earned_amount, created_at)

这两个查询都将使用它作为“覆盖”索引。两者都需要user_id是第一位的--以满足WHERE。第一个查询将只使用前两列,由于未使用的第三列,只需要少量开销。第二个查询不关心第二列和第三列的顺序,我选择这个顺序是为了使单个INDEX都能很好地工作。

两个单独的、单列的索引将不那么有效。MySQL可能只使用一个索引,它将是(user_id)。然后,它必须在包含索引的BTree和包含所有列的BTree之间反弹--以便至少得到earned_amount。“掩护”避免了这种反弹。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48825299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档