gpt4 book ai didi

mysql - 查询优化

转载 作者:行者123 更新时间:2023-11-29 01:33:21 25 4
gpt4 key购买 nike

SELECT nar.name, nar.reg, stat.lvl
FROM members AS nar
JOIN stats AS stat
ON stat.id = nar.id
WHERE nar.ref = 9

我在两个表中都有 id 索引,我也有索引 referavo。但是,它仍然检查统计表中的所有行(我使用 Explain 来获取此信息),但是在成员表中它只检查一行它应该是怎样的。统计表有什么问题?非常感谢。

CREATE TABLE `members` (
`id` int(11) NOT NULL
`ref` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT


CREATE TABLE `stats` (
`id` int(11) NOT NULL AUTO_INCREMENT
PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC



id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE stat ALL PRIMARY NULL NULL NULL 22
1 SIMPLE nar eq_ref PRIMARY PRIMARY 4 table_nme.stat.id 1 Using where

最佳答案

您的表格小得离谱 - 只有 23 行

MySQL 根据表中的行数以及它估计将被选择的行数(来自统计数据)选择不同的查询计划。您应该使用真实数据 对您的查询进行性能测试 - 数据量和数据中值的分布都应尽可能真实。否则 MySQL 在测试中选择的查询计划可能与您的实时系统的实际查询计划不同。

您的表非常小,使用索引可能比直接检查表。请记住,检查已在内存中的数据速度很快,但读取速度很慢。访问索引可能需要额外的读取——首先必须获取和读取索引以找到要选择的行,然后如果您的索引不是覆盖索引,则必须获取和读取表中的相关行以获取不在索引中的值。 MySQL 完全有权不使用索引,即使索引可用,如果它认为这样做会导致计划变慢。

在您的表中添加更多行(数千行)并尝试再次运行 EXPLAIN。您可能会发现,当您有更多行时,主键索引将用于连接。

关于mysql - 查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4699159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com