非常简单的问题。但是当涉及到SQL优化和索引时,我有点迷茫,我正在学习。
查询
SELECT A.*, count(A.ID) as count
FROM tableB B
JOIN tableA A ON A.ID = B.ID
WHERE B.otherID=xx and B.value='test' and B.languageID=3
表 A
CREATE TABLE `tableA` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`info1` varchar(64) NOT NULL default '',
`info2` varchar(64) NOT NULL default '',
PRIMARY KEY (`ID`)
) TYPE=MyISAM
表 B
CREATE TABLE `tableB` (
`ID` int(11) NOT NULL default '0',
`otherID` int(11) NOT NULL default '0',
`value` varchar(64) NOT NULL default '',
`languageID` int(11) NOT NULL default '0',
PRIMARY KEY (`ID`,`otherID`,`languageID`)
) TYPE=MyISAM
所以查询非常简单,我正在表 B 中查找具有特定 id 和值的字段,并且我正在表 A 上进行连接,因为我需要那里的一些信息。我想查询本身无法优化,但是如果我创建一个索引,也许我可以加快速度,也许在(B.otherID,B.value(上索引?
谢谢你的灯!
ID
用于PRIMARY KEY
。 PRIMARY KEY
必然是唯一的。 然而你说
PRIMARY KEY (`ID`,`otherID`,`languageID`)
ID
不是独一无二的,但这三重是吗? (只是检查。
回到你的问题...
WHERE B.otherID=xx and B.value='test' and B.languageID=3
表示B
需要复合索引中的这 3 列以任何顺序排列。 这样,优化器将从 B
开始,快速找到那里需要的行。 然后它将移动到 A
,它已经有一个索引ID
来处理ON A.ID = B.ID
。
我关于创建索引的食谱。
正常模式是 COUNT(*)
. COUNT(x)
有额外的负担来检查所有x
值是否NULL
。 (我怀疑你不需要那个。
使用InnoDB,而不是MyISAM。