Mysql 优化此查询-我应该做哪些索引或更改?

Mysql 优化此查询-我应该做哪些索引或更改?,mysql,query-optimization,Mysql,Query Optimization,很简单的问题。但我在学习sql优化和索引时有点不知所措 质疑 表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` (

很简单的问题。但我在学习sql优化和索引时有点不知所措

质疑

表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  (`ID`,`otherID`,`languageID`)
ID
不是唯一的,但是这个三元组是唯一的吗?(只是检查一下。)

回到你的问题上来

WHERE B.otherID=xx and B.value='test' and B.languageID=3
表示
B
需要以任意顺序在复合索引中包含这3列。这样,优化器将从
B
开始,快速找到需要的行。然后它将移到
A
,它已经在
ID
上有了一个索引来处理A.ID=B.ID
上的

关于创建索引

正常模式为
COUNT(*)
COUNT(x)
有额外的负担来检查所有
x
值是否为
NULL
。(我想你不需要这个。)


使用InnoDB,而不是MyISAM。

假设MySQL选择了使用这些索引的查询计划,那么在连接和where列上创建索引应该会有所帮助。在
a.ID
上创建不同的索引有什么意义?我假设这是一个自动递增列,因此它们都是唯一的?或者我错了吗?如果您向我们展示这两个表的模式,可能会很有用。我添加了表结构。是的,你是对的,distinct在这里是无用的好吧,我尝试了表B和列(otherID,value)的索引,现在查询速度大约快了10倍。我想这是我能为这个特定查询做的最好的了。谢谢谢谢,我不知道COUNT(*)和COUNT(x)之间有任何性能差异。关于索引,实际上我只需要索引中的B.otherID=xx和B.value。关于ID,这个ID在表a中是唯一的,在表B中它只是作为参考。关于使用InnoDB而不是MyISAM,这个选择取决于很多因素,我认为你不能说:使用InnoDB,point。MySQL的下一个版本将删除MyISAM。基本上,每一个支持MyISAM的论点都因InnoDB的改进而得到满足。唯一剩下的一个是InnoDB占用了更多的磁盘空间;这是无法修复的。(对不起,我想不出一个好的链接;在myisam和innodb上搜索。)
WHERE B.otherID=xx and B.value='test' and B.languageID=3