首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySql InnoDB数据库中慢查询的优化

MySql InnoDB数据库中慢查询的优化
EN

Stack Overflow用户
提问于 2011-02-10 22:09:21
回答 1查看 620关注 0票数 2

我有一个MySql数据库,它的查询运行得非常慢。我正在尽我所能让它表现得更好,但我看不出我在这里做错了什么。也许你可以?

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

查询:

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

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

回答 1

Stack Overflow用户

发布于 2011-08-22 20:18:10

如果我没有被OR弄糊涂的话,这个查询等同于:

代码语言:javascript
复制
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)上建立索引。

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

https://stackoverflow.com/questions/4958102

复制
相关文章

相似问题

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