首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单表覆盖索引的mysql查询优化策略

单表覆盖索引的mysql查询优化策略
EN

Stack Overflow用户
提问于 2015-07-06 19:17:43
回答 1查看 36关注 0票数 0

目前,我正在进行mysql查询优化。我的mysql表包含2亿条记录。在谷歌上做了很多次之后,我最终决定使用覆盖索引。

所以,我按照这个顺序做了一个索引

代码语言:javascript
复制
alter table table_name add index
     index_name(MODEL, COUNTRY, REGION, NETWORK, E_TUAL,
                ECHS, DEVID, COUNTRY_CODE, SOURCE);

当我运行这个查询时,效率与以前相比是很好的

代码语言:javascript
复制
SELECT E_TUAL,ECHS, DEVID, MODEL, COUNTRY, REGION, COUNTRY_CODE, NETWORK, SOURCE
FROM table_name
WHERE model = 'fox | s453' AND country = 'india' AND
      E_TUAL <= '1435755600' AND
      E_TUAL >= '1433163600'

ORDER BY E_TUAL DESC LIMIT 101偏移量0;

代码语言:javascript
复制
+----+-------------+-----------+------+---------------+--------+---------+-------------+------+-----------------------------+
| id | select_type | table     | type | possible_keys | key    | key_len | ref         | rows | Extra                       |
+----+-------------+-----------+------+---------------+--------+---------+-------------+------+-----------------------------+
|  1 | SIMPLE      | mytable | ref  | genrl  | genrl | 131     | const |  239 | Using where; Using filesort |
+----+-------------+-----------+------+---------------+--------+---------+-------------+------+-----------------------------+

但是这个查询比旧的查询(在索引之前)更糟糕。

代码语言:javascript
复制
SELECT E_TUAL,ECHS, DEVID, MODEL,COUNTRY, REGION, COUNTRY_CODE, NETWORK, SOURCE
FROM table_name
WHERE model = 'fox | s453' AND
      country is not null AND
      E_TUAL <= '1435755600' AND
      E_TUAL >= '1433163600'
ORDER BY E_TUAL DESC
LIMIT 101 OFFSET 0;

+----+-------------+-----------+-------+---------------+--------+---------+------+------+-----------------------------+
| id | select_type | table     | type  | possible_keys | key    | key_len | ref  | rows | Extra                       |
+----+-------------+-----------+-------+---------------+--------+---------+------+------+-----------------------------+
|  1 | SIMPLE      | mytable | range | genrl  | genrl | 131     | NULL | 1105 | Using where; Using filesort |
+----+-------------+-----------+-------+---------------+--------+---------+------+------+-----------------------------+

我写了country is not null来维护顺序,所以mysql优化器使用索引

当某些列字段缺失时,请帮助如何提高效率

要使用索引,我能做些什么?

我的英语不好。所以对于任何错误我深表歉意

EN

回答 1

Stack Overflow用户

发布于 2015-07-06 19:26:56

去掉覆盖索引,使用两个独立的索引:

代码语言:javascript
复制
alter table table_name add index index_name(MODEL, COUNTRY, E_TUAL);

对于第一个查询。和:

代码语言:javascript
复制
alter table table_name add index index_name(MODEL, E_TUAL);

覆盖索引可能会提供边际改进,但它将使用大量空间。相反,如果可以将这些子句用于索引,请先关注WHERE子句,然后再关注ORDER BY

注意:对于这两个查询,您对列的排序都不是最佳的。

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

https://stackoverflow.com/questions/31244467

复制
相关文章

相似问题

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