首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >静态表的MySQL最佳索引

静态表的MySQL最佳索引
EN

Stack Overflow用户
提问于 2014-01-13 09:40:20
回答 1查看 635关注 0票数 1

Mysql中有下表(T):

代码语言:javascript
复制
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| first  | varchar(50) | NO   | PRI | NULL    |       |
| second | varchar(50) | NO   | PRI | NULL    |       |
| third  | varchar(50) | NO   | PRI | NULL    |       |
| count  | bigint(20)  | NO   |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+

此表包含数百万行。我建立了以下指数:

代码语言:javascript
复制
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name  | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| T     |          0 | PRIMARY   |            1 | first       | A         |      591956 |     NULL | NULL   |      | BTREE      |         |               |
| T     |          0 | PRIMARY   |            2 | second      | A         |    67927032 |     NULL | NULL   |      | BTREE      |         |               |
| T     |          0 | PRIMARY   |            3 | third       | A         |   271708128 |     NULL | NULL   |      | BTREE      |         |               |
| T     |          1 | SECONDARY |            1 | second      | A         |      398399 |     NULL | NULL   |      | BTREE      |         |               |
| T     |          1 | SECONDARY |            2 | third       | A         |    45284688 |     NULL | NULL   |      | BTREE      |         |               |
| T     |          1 | SEC       |            1 | second      | A         |     4382389 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

这类搜索:

代码语言:javascript
复制
SELECT * FROM T WHERE first = "WHAT" AND third = "EVER";

代码语言:javascript
复制
SELECT * FROM T WHERE first = "WHAT" AND second = "EVER";

而且通常是快速的(结果总是在1秒内得到)。然而,搜索结果如下:

代码语言:javascript
复制
SELECT * FROM T WHERE second = "WHAT" AND third = "EVER";

非常慢(通常超过1分钟)。我创建了索引SEC (参见索引表),但这并不能改善结果。

我应该使用什么索引来使这些搜索更快?(我没有继续做实验,因为创建一个索引大约需要5个小时)

更多信息:表是静态的(也就是说,我不会再添加任何行-我只对搜索速度感兴趣),磁盘空间不是问题。

EN

回答 1

Stack Overflow用户

发布于 2014-01-13 09:44:09

使用与查询匹配的字段组成的其他索引。如果行组合是唯一的,则使用主索引。这些提供了比辅助索引更快的访问速度。由于表是静态的-索引的数量不会影响性能(任何更新、删除和插入都需要对表的每个索引进行更新)。

因此,为了更快地从该查询中检索,请创建secondthird列的索引:

代码语言:javascript
复制
ALTER TABLE T ADD PRIMARY KEY (second, third);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21087924

复制
相关文章

相似问题

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