当前位置: 首页 > 面试题库 >

如何通过使用索引在InnoDB上优化COUNT(*)性能

冉锋
2023-03-14
问题内容

我有一个小而狭窄的InnoDB表,大约有900万条记录。在桌子上count(*)count(id)桌子上做的速度非常慢(超过6秒):

DROP TABLE IF EXISTS `perf2`;

CREATE TABLE `perf2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `channel_id` int(11) DEFAULT NULL,
  `timestamp` bigint(20) NOT NULL,
  `value` double NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ts_uniq` (`channel_id`,`timestamp`),
  KEY `IDX_CHANNEL_ID` (`channel_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

RESET QUERY CACHE;
SELECT COUNT(*) FROM perf2;

虽然该语句不是运行得太频繁,但对其进行优化将是不错的选择。根据http://www.cloudspace.com/blog/2009/08/06/fast-
mysql-innodb-count-really-
fast/,

这可以通过强制InnoDB使用索引来实现:

SELECT COUNT(id) FROM perf2 USE INDEX (PRIMARY);

解释计划似乎很好:

id  select_type table   type    possible_keys   key     key_len ref     rows    Extra
1   SIMPLE      perf2   index   NULL            PRIMARY 4       NULL    8906459 Using index

不幸的是,声明像以前一样缓慢。根据“ SELECT
COUNT(*)”的说法,它很慢,即使使用where子句,我也曾尝试优化表,但未成功。

什么是/如何COUNT(*)在InnoDB 上优化性能


问题答案:

目前,我已经通过使用以下近似值解决了这个问题:

EXPLAIN SELECT COUNT(id) FROM data USE INDEX (PRIMARY)

rows如上所示,使用InnoDB时,可以从解释计划的列中读取大约行数。当使用MyISAM时,它将保留EMPTY,因为将优化表引用,因此,如果是空空回退到传统的话SELECT COUNT



 类似资料:
  • 本文向大家介绍mysql性能优化之索引优化,包括了mysql性能优化之索引优化的使用技巧和注意事项,需要的朋友参考一下   作为免费又高效的数据库,mysql基本是首选。良好的安全连接,自带查询解析、sql语句优化,使用读写锁(细化到行)、事物隔离和多版本并发控制提高并发,完备的事务日志记录,强大的存储引擎提供高效查询(表记录可达百万级),如果是InnoDB,还可在崩溃后进行完整的恢复,优点非常多

  • 本文向大家介绍MySQL如何优化索引,包括了MySQL如何优化索引的使用技巧和注意事项,需要的朋友参考一下 1.  MySQL如何使用索引 索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后遍历整个表以找到相关的行。表越大,花费越多。如果表中有相关列的索引,MySQL可以快速确定要在数据文件中间查找的位置,而不必查看所有数据。这比顺序读取每一行要快得多。 大多数MyS

  • 本文向大家介绍MySQL性能优化之如何高效正确的使用索引,包括了MySQL性能优化之如何高效正确的使用索引的使用技巧和注意事项,需要的朋友参考一下 实践是检验真理的唯一途径,本篇只是站在索引使用的全局来定位的,你只需要通读全篇并结合具体的例子,或回忆以往使用过的地方,对整体有个全面认识,并理解索引是如何工作的,就可以了。在后续使用索引,或者优化索引时,可以从这些方面出发,进一步来加深对索引正确高效

  • 问题内容: 假设您有这样的查询… 可以将多个人分配给给定任务。该查询的目的是显示每个任务一行,但将分配给该任务的人员显示在单个列中 现在…假设你有正确的指标设置上,和。连接到派生表时,MySQL Optimizer仍将不使用TaskID索引。WTF?!?!? 因此,我的问题是…如何使此查询使用task_assigned_users.TaskID上的索引?临时表是la脚的,所以如果这是唯一的解决方案

  • 问题内容: 使用Elasticsearch渗滤器索引时,有没有办法改善内存性能? 我为渗滤器创建了一个单独的索引。我大约有1000000个用户创建了保存的搜索(用于电子邮件警报)。创建此过滤器索引后,我的堆使用率飙升至100%,服务器对任何查询均无响应。我的资源有限,无法简单地在此问题上投入更多的RAM。唯一的解决方案是删除包含我已保存的搜索的索引。 根据我的阅读,渗滤器索引永久地驻留在内存中。这

  • 问题内容: 在这里很难说出要问什么。这个问题是模棱两可,含糊不清,不完整,过于宽泛或夸张的,不能以目前的形式合理地回答。如需帮助澄清此问题以便可以重新打开, 请访问帮助中心。 8年前关闭。 有一个查询运行得比我想要的慢,但是我无法共享详细信息。该查询已经返回了正确的结果,并且已经对其进行了重构,但是我无法使其足够快地运行。谓词在可能的情况下已经是可Sarg- able 的。它已经正确地使用了联接,