首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化此查询-我应该做哪些索引或更改?

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

Stack Overflow用户
提问于 2017-04-12 19:13:51
回答 1查看 32关注 0票数 1

一个很简单的问题。但是当涉及到sql优化和索引时,我有点迷茫,我正在学习。

查询

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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)上创建一个索引?

谢谢你的灯光!

EN

回答 1

Stack Overflow用户

发布于 2017-04-14 06:22:37

通常,PRIMARY KEY使用名称IDPRIMARY KEY必须是唯一的。但你却说

代码语言:javascript
复制
PRIMARY KEY  (`ID`,`otherID`,`languageID`)

ID不是唯一的,但这个三元组是唯一的吗?(只是检查一下。)

回到你的问题..。

代码语言:javascript
复制
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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43367989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档