我正在尝试优化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秒钟以上的时间。
答案 0 :(得分:0)
这就是为什么要花很长时间的原因。 (我会穿插一些问题以帮助确认我的陈述。)
innodb_buffer_pool_size
的值是什么。)PRIMARY KEY(id, searchEngine)
非常奇怪,因为id
是AUTO_INCREMENT
。 (你能证明吗?)SHOW CREATE TABLE
;它比DESCRIBE
更具描述性。domain
可以仅仅是INT
吗? (我也在考虑缩小表的大小。)为什么要超过60秒... 662,733行中有很大一部分需要从磁盘中获取。
回答其中一些问题;那么我可能对加快查询速度有具体的建议。