mysql 使用计数的查询速度较慢

vq8itlhq  于 2022-12-10  发布在  Mysql
关注(0)|答案(1)|浏览(148)

我遇到了MySQL Count查询的问题,它花费的时间比我预期的要长得多。查询为:

SELECT count(1) FROM pages WHERE site_id = 123456 AND online = 1 AND ignored = 0

该查询在一个表上运行,该表有大约500万条记录,大小为2 GB。
这个查询大约需要2秒,比我预期的要慢得多。我的应用程序有许多更大的表和更复杂的查询,这些都运行得更快。
当我对查询运行EXPLAIN时,我可以看到它正在使用索引。我最近对该表进行了优化,但没有产生任何明显的改进。
有什么方法可以提高这些查询的性能吗?

编辑

创建查询:

CREATE TABLE `pages` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`created` DATETIME NOT NULL,
`modified` DATETIME NOT NULL,
`site_id` INT(11) NOT NULL,
`path` LONGTEXT NULL DEFAULT NULL COLLATE 'utf8mb4_bin',
`online` TINYINT(4) NULL DEFAULT '1',
`ignored` TINYINT(4) NULL DEFAULT '0',
`redirected_to_page_id` INT(11) NULL DEFAULT '0',
`latest_http_response` VARCHAR(10) NULL DEFAULT NULL COLLATE 'utf8mb4_bin',
`noindex_nofollow_result` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_bin',
`deleted` DATETIME NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`) USING BTREE,
INDEX `Index 2` (`site_id`, `online`, `ignored`, `redirected_to_page_id`, `deleted`) USING BTREE,
INDEX `Index 4` (`site_id`, `deleted`, `noindex_nofollow_result`) USING BTREE,
INDEX `Index 5` (`crawl_job_id`) USING BTREE,
INDEX `Index 3` (`site_id`, `latest_http_response`, `online`, `ignored`, `deleted`) USING BTREE
)
COLLATE='utf8mb4_bin'
ENGINE=InnoDB
ROW_FORMAT=DYNAMIC
AUTO_INCREMENT=13135003;

解释的结果
Id|SELECT_TYPE|TABLE|Partitions|TYPE|Posable_Key|key|key_len|ref|row|Filted|Extra
|-|-|
|Simple|Pages||Ref|索引2,索引4,索引3|索引2|8|const,const,const|184|100,00|使用索引

zlwx9yxi

zlwx9yxi1#

查询中的COUNT(*)是什么?数字越大,花费的时间就越长--假设您有一个合适的索引。
EXPLAIN表明它使用的是最佳可用索引。主要线索是“使用索引”,意思是“覆盖”。此外,基本上没有明显更好的指数。我还检查了列的数据类型,没有发现重大问题。
运行两次SELECT。由于BUFFER_POOL中的缓存,第二次运行的速度可能要快得多。(因此,在询问查询速度时,请运行查询两次。)
OPTIMIZE TABLE几乎总是无用的(而且需要时间)。在极少数情况下,ANALYZE TABLE(非常快)会有帮助。我也不推荐。
更复杂的查询
加快一个查询的速度不一定会对其他查询产生任何影响。欢迎您在本论坛中提出“复杂”的问题(加上创建表和解释)以获得建议。

相关问题