我正试图优化mysql查询以使其运行更平稳,但现在我被卡住了。
我正在使用此查询:
SELECT
sr.path,
sr.keywordId,
sr.rank
FROM
serp_results sr
WHERE
sr.domain = 971
AND sr.searchEngine = 1
它试图从大约544003737行的表中得到结果。我最近添加了一个复合索引列搜索引擎,域,但它没有工作。
这是表结构:
| 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条答案
按热度按时间4nkexdtk1#
这就是为什么要花很长时间(我会穿插一些问题来帮助确认我的陈述。)
你的table是innodb(是吗?)
您的ram比表小得多(表有多大,以gb为单位)?多少公羊?它的价值是什么
innodb_buffer_pool_size
.)662733行散落在table周围(或者这些行可能是按时间顺序聚集在一起的,有什么原因吗?)
您有一个旋转的hdd,或者您有一个或多个ssd驱动器(我认为这与我的讨论无关;但是你有哪一个?)
PRIMARY KEY(id, searchEngine)
很奇怪,考虑到这一点id
是AUTO_INCREMENT
. (你能证明这一点吗?)请提供
SHOW CREATE TABLE
; 它更具描述性DESCRIBE
.你还有其他重要的问题吗(有时加快一个查询的速度会减慢其他查询的速度。这就是我想去的方向。告诉那些你不想让我慢下来的人。)
可以
domain
公正INT
? (我也在考虑缩小table的尺寸。)为什么超过60秒。。。662733行中有很大一部分需要从磁盘获取。
回答一些问题;那么我可能会有一个具体的建议来加速查询。