在MySQL查询中添加limit子句会大大降低查询速度
我试图解决MySQL上的一个性能问题,所以我想创建一个较小版本的表来使用。当我向查询中添加LIMIT子句时,它从大约2秒(对于完整插入)变为天文数字(42分钟)在MySQL查询中添加limit子句会大大降低查询速度,mysql,performance,limit,Mysql,Performance,Limit,我试图解决MySQL上的一个性能问题,所以我想创建一个较小版本的表来使用。当我向查询中添加LIMIT子句时,它从大约2秒(对于完整插入)变为天文数字(42分钟) 答案有点长,但我希望你能从中学到一些东西 因此,根据explain语句中的证据,您可以看到MySQL查询优化器可以使用两个可能的索引,它们如下所示: possible_keys PRIMARY,insert_date 但是,MySQL查询优化器决定使用以下索引: key insert_date MySQL查询优化器很少使用错误的索
答案有点长,但我希望你能从中学到一些东西 因此,根据explain语句中的证据,您可以看到MySQL查询优化器可以使用两个可能的索引,它们如下所示:
possible_keys
PRIMARY,insert_date
但是,MySQL查询优化器决定使用以下索引:
key
insert_date
MySQL查询优化器很少使用错误的索引。现在有一个可能的原因。您正在处理静态开发数据库。您可能从生产中恢复了此功能,以进行开发
当MySQL优化器需要决定在查询中使用哪个索引时,它会查看所有可能索引的统计信息。您可以在这里阅读更多有关统计信息的入门资料
因此,在更新、插入和删除表时,您会更改索引统计信息。可能是MySQL服务器因为静态数据而具有错误的统计信息,并选择了错误的索引。然而,这只是一个猜测,在这一点上,作为一个可能的根本原因
现在让我们深入研究索引。有两种可能的索引可以使用主键索引和插入日期索引。MySQL使用了插入日期。请记住,在查询执行期间,MySQL始终只能使用一个索引。让我们看看主键索引和插入日期索引之间的区别
关于主键索引(也称为聚集索引)的简单事实:
希望这能让你更好地理解指数以及为什么它们是一把双刃剑。也有同样的问题。当我添加
FORCE INDEX(id)
时,它返回到了查询的几毫秒,没有限制,同时生成了相同的结果。我怀疑您的问题是文件排序,但我更担心查询在做什么。例如,将行添加到date\u curr,然后将行添加到date\u prev。然后在查询中选择“从日期\当前”,而在查询中从不使用“日期\当前”?请稍微澄清一下这个例子。另外,程序的哪一部分花费的时间最长?是精选的吗?是插页吗?请澄清。如何使用show create table player\u record
,以便我们可以查看所有其他内容,如索引等。我打赌,如果在要查询的日期列上添加索引,会加快查询速度。我在insert\u date上有一个索引,它是exp中使用的键
mysql> explain SELECT pr.player_id,
MAX(pr.insert_date) AS insert_date
FROM player_record pr
INNER JOIN date_curr dc
ON pr.player_id = dc.player_id
WHERE pr.insert_date < '2012-05-15'
GROUP BY pr.player_id
LIMIT 0,20000;
+----+-------------+-------+-------+---------------------+-------------+---------+------+--------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------------+-------------+---------+------+--------+----------------------------------------------+
| 1 | SIMPLE | pr | range | PRIMARY,insert_date | insert_date | 3 | NULL | 396828 | Using where; Using temporary; Using filesort |
| 1 | SIMPLE | dc | ALL | PRIMARY | NULL | NULL | NULL | 216825 | Using where; Using join buffer |
+----+-------------+-------+-------+---------------------+-------------+---------+------+--------+----------------------------------------------+
2 rows in set (0.03 sec)
| Status | Duration | CPU_user | CPU_system | Context_voluntary | Context_involuntary | Block_ops_in | Block_ops_out | Messages_sent | Messages_received | Page_faults_major | Page_faults_minor | Swaps | Source_function | Source_file | Source_line |
| Copying to tmp table | 999.999999 | 999.999999 | 0.383941 | 110240 | 18983 | 16160 | 448 | 0 | 0 | 0 | 43 | 0 | exec | sql_select.cc | 1976 |
possible_keys
PRIMARY,insert_date
key
insert_date