首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择count(*)查询太慢。我想这不是索引的工作

问选择count(*)查询太慢。我想这不是索引的工作
EN

Stack Overflow用户
提问于 2019-12-20 08:20:18
回答 3查看 273关注 0票数 0

我想征求意见,因为我做了一个更好的搜索。

我的服务器环境在下面。

  • CentOS发布5.1
  • Linux2.6,18
  • CPU : Intel (R) Xeon (R) CPU E3-1230 v3 @ 3.30GHz 8核
  • M/ M: 8GB
  • MySQL v5.5.40H 210F 211

这个表中大约有26万条记录(Kc_)。

代码语言:javascript
复制
 mysql> desc kc_article;

+ --------------------- + ---------------------- + ---- -+ ----- + --------------------- + ---------------- +

| Field | Type | Null | Key | Default | Extra |

+ --------------------- + ---------------------- + ---- -+ ----- + --------------------- + ---------------- +

| idx | int (11) | NO | PRI | NULL | auto_increment |

| w_status | tinyint (4) | NO | MUL | 1 | |

| w_subj | varchar (255) | NO | MUL | NULL | |

~~ omission ~~

| w_section1 | int (11) | NO | MUL | NULL | |

| w_section2 | int (11) | NO | MUL | NULL | |

| w_theme | int (11) | NO | MUL | NULL | |

~~ Lay ~~

尽管索引是在查询条件下创建的,但速度有时超过1、2、10或20秒。w_status和w_section2都是索引的。

代码语言:javascript
复制
mysql> explain select count (*) as cnt from kc_article
       where w_status> 5
         and (w_section2 = '68')
代码语言:javascript
复制
+ ---- + ------------- + ------------ + ------ + ---------- ----------- + ------------ + --------- + ------- + ------- + ------------- +

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+ ---- + ------------- + ------------ + ------ + ---------- ----------- + ------------ + --------- + ------- + ------- + ------------- +

| 1 | SIMPLE | kc_article | ref | w_section2, w_status | w_section2 | 4 | const | 33548 | Using where |

+ ---- + ------------- + ------------ + ------ + ---------- ----------- + ------------ + --------- + ------- + ------- + ------------- +

对于检查、恢复和优化表,并在删除索引后重新创建表,情况也是如此。w_status的值为0到6之间的整数,6为95%或更多。

我期待着您的回音。

EN

回答 3

Stack Overflow用户

发布于 2019-12-20 10:33:50

首先,这个查询:

代码语言:javascript
复制
select count (*) as cnt from kc_article where w_status> 5 and (w_section2 = '68')

应写为:

代码语言:javascript
复制
select count (*) as cnt from kc_article where w_status =  and w_section2 = 68

括号是多余的,因为w_section2是一个整数,所以应该将它与整数而不是字符串进行比较。此外,w_status范围从0到6,因此可以使用相等条件而不是不等式。

您提到w_status和w_section2都是索引的。对于此查询,您需要两列的复合索引,而不是每列的索引(否则,MySQL不能同时使用这两种索引)。如果它不存在,那么创建它:

代码语言:javascript
复制
create index kc_article_status_section_idx on kc_article(w_status, w_section2);

几十万行不是一个大数据集,我希望您的查询应该使用上面的索引快速运行。

票数 1
EN

Stack Overflow用户

发布于 2019-12-20 10:46:38

从kc_article选择count (1)作为cnt,其中w_status> 5和w_section2 = '68‘

票数 0
EN

Stack Overflow用户

发布于 2019-12-24 03:00:20

按照这个顺序,这个综合索引是您所需要的:

代码语言:javascript
复制
INDEX(w_secdion2, w_status)

在构建索引时,从=子句开始。请参阅http://mysql.rjweb.org/doc.php/index_cookbook_mysql

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

https://stackoverflow.com/questions/59421967

复制
相关文章

相似问题

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