大数据表 MySQL 查询优化

Posted

技术标签:

【中文标题】大数据表 MySQL 查询优化【英文标题】:Big data table MySQL query optimization 【发布时间】:2020-06-08 13:15:11 【问题描述】:

我正在尝试优化我的 mysql 查询以更顺畅地运行,但现在我卡住了。

我正在使用这个查询:

SELECT
    sr.path,
    sr.keywordId,
    sr.rank
FROM
    serp_results sr
WHERE
    sr.domain = 971
    AND sr.searchEngine = 1

它会尝试从大约有 544,003,737 行的表中获取结果。我最近为 searchEngine,domain 列添加了复合索引,但它不起作用。

这是表结构:

| Field             | Type                 | Null | Key | Default | Extra          |
|-------------------|----------------------|------|-----|---------|----------------|
| id                | bigint(10) unsigned  | NO   | PRI |         | auto_increment |
| keywordId         | int(10) unsigned     | NO   | MUL |         |                |
| searchEngine      | tinyint(3) unsigned  | NO   | PRI |         |                |
| position          | smallint(5) unsigned | NO   |     |         |                |
| rank              | float unsigned       | NO   |     |         |                |
| path              | varchar(500)         | NO   |     |         |                |
| domain            | bigint(20) unsigned  | YES  | MUL |         |                |
| firstDomainResult | tinyint(1) unsigned  | NO   |     |         |                |
| added             | date                 | YES  | MUL |         |                |

+ 索引:

| index_name                         | index_algorithm | is_unique | column_name                        |   |
|------------------------------------|-----------------|-----------|------------------------------------|---|
| serp_results_searchEngine_domain   | BTREE           | FALSE     | searchEngine,domain                |   |
| serp_results_domain_index          | BTREE           | FALSE     | domain                             |   |
| serp_results_added_index           | BTREE           | FALSE     | added                              |   |
| keywordId_searchEngine_position    | BTREE           | TRUE      | keywordId,searchEngine,position    |   |
| domain_firstDomainResult_keywordId | BTREE           | FALSE     | domain,firstDomainResult,keywordId |   |
| PRIMARY                            | BTREE           | TRUE      | id,searchEngine                    |   |

编辑:大量域记录确实需要大约 60 多秒。

【问题讨论】:

请在您的问题中将表结构+索引作为文本发布。其他网站上的图片的问题是它们在问题出现之前就消失了 返回了多少行?您可能只是遇到了日期量问题。 在这个特定示例中,返回了 662,733 行。 @GordonLinoff “数据量问题”是什么意思? @DavidPivoňka 。 . .如果您要返回 10,000,000 行,那么这将需要一些时间。 【参考方案1】:

这就是为什么需要很长时间。 (我会穿插一些问题来帮助确认我的陈述。)

您的表是 InnoDB。 (是吗?) 您的 RAM 比表格小得多(表格有多大,以 GB 为单位?多少 RAM?innodb_buffer_pool_size 的值是多少。) 662,733 行分散在表格周围。 (或者是否有某些原因导致这些行可能按时间顺序聚集?) 您有一个旋转的 HDD,或者您有 SSD 驱动器。 (我不认为这对我的讨论很重要;但是你有哪一个?) PRIMARY KEY(id, searchEngine) 很奇怪,因为idAUTO_INCREMENT。 (你能证明它的合理性吗?) 请提供SHOW CREATE TABLE;它比DESCRIBE 更具描述性。 您还有其他重要问题吗? (有时加快一个查询会减慢其他查询。这就是我想要的方向。显示那些你不想让我减慢的查询。) domain 可以只是INT 吗? (我也在考虑缩小表格大小。)

至于为什么超过 60 秒... 662,733 行中有很大一部分需要从磁盘中获取。

回答其中一些问题;那么我可能有一个加快查询速度的具体建议。

【讨论】:

以上是关于大数据表 MySQL 查询优化的主要内容,如果未能解决你的问题,请参考以下文章

MySQL百万级数据表or查询优化

MySQL大数据量分页查询方法及其优化

mysql 大数据分页查询优化

mysql大数据查询优化

sql优化之大数据量分页查询(mysql)

提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)