覆盖指数未显示预期的性能

时间:2014-07-01 06:28:49

标签: mysql sql database indexing

我有两个表相同的结构。我为一个表的列添加了索引,为其他故事添加了涵盖索引。表结构如下

CREATE TABLE IF NOT EXISTS `customer` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL DEFAULT 'first_name',
  `last_name` varchar(255) NOT NULL DEFAULT 'last_name',
  `pin` bigint(music) NOT NULL DEFAULT '679339',
  `event_time` bigint(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COMMENT='test db' AUTO_INCREMENT=1 ;

使用以下查询为表添加索引

表1 (正常索引)

alter table customer add INDEX(name)

alter table customer add INDEX(event_time)

表2 (涵盖指数)

alter table customer_tb add INDEX(name,event_time)

在两个表中插入100 000条记录并运行以下查询::

"select name, event_time from customer_tb group by event_time order by event_time"

索引表的查询时间:0.185sec

覆盖索引表的查询时间:1.29秒

为什么覆盖索引没有像普通的索引表那样显示结果性能。

用于覆盖索引的查询如下:

alter table customer_tb add INDEX(name,event_time)

1 个答案:

答案 0 :(得分:1)

您有一个索引覆盖查询中引用的两个列,但您使用错误顺序的列定义了索引。你应该这样定义它们:

ALTER TABLE customer_tb ADD INDEX(event_time,name);

索引中的列顺序非常重要。我最喜欢的索引类比是电话簿。如果我要求您在电话簿中找到姓氏为#34; Smith"这很容易。但是,如果我要求你找到任何名字和#34; John,"那么这本书预先分类的事实并没有帮助你。

同样,如果我要求您提供姓氏列表以及每个姓氏的人数分组计数,您可以通过翻阅该书来完成,并且您知道给定姓氏的所有出现次数在一起。因此,您不必跟踪您已经看过的每个姓氏的数量,您只需计算它们,当您找到不同的姓氏时,您需要报告运行总数并重新开始。

但是,如果我要求你告诉我每个名字有多少人的数量,突然间它会变得更加困难,因为它们分散在整本书中。你必须保持一个正在运行的计数,但是N运行计数,每个可能的名字一个。