Mysql 查询优化

Mysql 查询优化,mysql,sql,query-optimization,Mysql,Sql,Query Optimization,我在两个表中都有id上的索引,也有索引refereavo。但它仍然会检查stats表中的所有行(我使用Explain来获取此信息),但在members表中,它只检查一行应该如何。统计表有什么问题?多谢各位 SELECT nar.name, nar.reg, stat.lvl FROM members AS nar JOIN stats AS stat ON stat.id = nar.id WHERE nar.ref = 9 MySQL在每个表中一次只能使用一个索引,因此它使用索引查看成员行

我在两个表中都有id上的索引,也有索引refereavo。但它仍然会检查stats表中的所有行(我使用Explain来获取此信息),但在members表中,它只检查一行应该如何。统计表有什么问题?多谢各位

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

MySQL在每个表中一次只能使用一个索引,因此它使用索引查看
成员
行,然后对ID执行顺序搜索

您必须为
成员
表创建多列索引

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
如果情况没有好转,请尝试相反的方法(第一:在成员上删除索引idref)


(我现在不能亲自尝试)

你的桌子小得可笑——只有23行很小

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

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


在表中多放几行(数千行),然后再次尝试运行EXPLAIN。您可能会发现,当您有更多行时,主键索引将用于联接。

请发布
SHOW CREATE TABLE members
SHOW CREATE TABLE stats
EXPLAIN SELECT…
的输出。好的,请稍等。谢谢。
stat.id
nar.id
有相同的数据类型吗?我想你有mysql<5.1?尝试升级到5.1,索引管理更好<代码>选择@@version是的,卢卡斯,它有相同的数据类型。MySQL一次只能使用一个表的索引是真的吗?这意味着我对此无能为力。您可以为相关表添加多列索引。@ring0:是的,现在它可以工作了。但是我猜仅仅为一个查询添加一个索引是没有效率的,一个查询一小时发生几次,对吗?这取决于您拥有的行数。如果您的表增长很多,MySQL必须对很多行执行顺序搜索,那么索引的性能提升是值得的。索引大小也与表的大小成比例。如果查询要临时使用几个月,则不需要在小表上建立索引。但是如果你计划长期使用,我会创建正确的索引。取决于您是否是唯一的用户/开发人员/维护人员。。。如果没有,最好创建一个能够处理可伸缩性的DB模型。@嘿,这不是针对15次重复,但我认为我的答案与你的问题相符,不是吗?现在它只有23行,但将来它将有数百行甚至数千行。@嘿:顺便说一下,这就是我要求您发布showcreateTable完整且未修改的输出的原因之一。如果您在问题中发布了此输出,则会立即发现此类错误。
 CREATE INDEX idref ON members(id,ref);
 CREATE INDEX idref ON members(ref,id);