我有一个MySql数据库,它的查询运行得非常慢。我正在尽我所能让它表现得更好,但我看不出我在这里做错了什么。也许你可以?
CREATE TABLE `tablea` (
`a` int(11) NOT NULL auto_increment,
`d` mediumint(9) default NULL,
`c` int(11) default NULL,
PRIMARY KEY (`a`),
KEY `d` USING BTREE (`d`)
) ENGINE=InnoDB AUTO_INCREMENT=1867710 DEFAULT CHARSET=utf8;
CREATE TABLE `tableb` (
`b` int(11) NOT NULL auto_increment,
`d` mediumint(9) default '1',
`c` int(10) NOT NULL,
`e` mediumint(9) default NULL,
PRIMARY KEY (`b`),
KEY `c` (`c`),
KEY `d` (`d`),
) ENGINE=InnoDB AUTO_INCREMENT=848150 DEFAULT CHARSET=utf8;查询:
SELECT tablea.a, tableb.e
FROM tablea
INNER JOIN tableb ON (tablea.c=tableb.c) AND (tablea.d=tableb.d OR tableb.d=1)
WHERE tablea.d=100如果tablea.d=100给出1500行,(tablea.d=tableb.d OR tableb.d=1)给出1600行,那么这个查询大约需要10秒钟。这似乎真的很慢。我需要让它更快,但我看不出我做错了什么。
MySql解释输出:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE tablea ref d d 4 const 1092 Using where
1 SIMPLE tableb ref c,d c 4 tablea.c 1 Using where发布于 2011-08-22 20:18:10
如果我没有被OR弄糊涂的话,这个查询等同于:
SELECT tablea.a, tableb.e
FROM tablea
INNER JOIN tableb
ON tablea.c = tableb.c
WHERE tablea.d = 100
AND tableb.d IN (1,100) 尝试使用不同的索引(使用EXPLAIN)。在d字段上建立索引(在两个表中)会有所帮助。也许更多,在(d,c)上建立索引。
https://stackoverflow.com/questions/4958102
复制相似问题