一个很简单的问题。但是当涉及到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)上创建一个索引?
谢谢你的灯光!
发布于 2017-04-14 06:22:37
通常,PRIMARY KEY使用名称ID。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。
https://stackoverflow.com/questions/43367989
复制相似问题