大数据表MySQL查询优化

时间:2020-06-08 13:15:11

标签: mysql sql optimization bigdata

我正在尝试优化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秒钟以上的时间。

1 个答案:

答案 0 :(得分:0)

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

  • 您的表是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行中有很大一部分需要从磁盘中获取。

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

相关问题