MySQL优化庞大的表

lor*_*tyx 13 mysql optimization

我一直试图在某个SELECT查询上获得一些速度提升.情况如下:(在我看来)有一个巨大的交叉桌.它目前有大约2000万行,但我预计这会增长很多.根据这个交叉表,我需要创建另一个表.为此,我需要执行以下查询:

SELECT hugeCrossingTable.field3, otherTable.field1, hugeCrossingTable.field2 * otherTable.field3 AS someName
FROM hugeCrossingTable 
INNER JOIN otherTable ON hugeCrossingTable.field1 = otherTable.field2
Run Code Online (Sandbox Code Playgroud)

现在这导致大约一百万行.我已经在2个表中的field1上都有索引,但它仍然需要18分钟才能完成..我考虑拆分表,但后来我需要找到一种方法来分析数据,因为它是只是一个交叉表没有想到如何做到这一点.

关于如何优化这一点的任何想法?

谢谢.

根据要求,这里是create语句:

CREATE TABLE  `hugeCrossingTable` (
  `field` int(11) NOT NULL,
  `field1` int(11) NOT NULL,
  `field2` double(10,5) DEFAULT NULL,
  `field3` int(4) DEFAULT NULL,
  KEY `field1` (`field1`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE  `otherTable` (
  `field` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `field1` int(10) unsigned NOT NULL,
  `field2` int(10) unsigned NOT NULL,
  `field3` decimal(5,2) NOT NULL,
  PRIMARY KEY (`field`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)

并解释输出:

id, select_type, table              , type , possible_keys, key     , key_len, ref                , rows, Extra
1 , 'SIMPLE'   , 'otherTable'       , 'ALL', ''           , ''      , ''     , ''                 , 294 , ''
1 , 'SIMPLE'   , 'hugeCrossingTable', 'ref', 'field1'     , 'field1', '4'    , 'otherTable.field2', 69  , 'Using where'
Run Code Online (Sandbox Code Playgroud)

Jon*_*ack 22

这里有一些innodb例子适用于大约几个大表.6000到5亿行,展示了精心设计的innodb表的优势以及如何最好地使用聚簇索引(仅适用于innodb)

MySQL和NoSQL:帮我选择合适的

6000万条目,从某个月中选择条目.如何优化数据库?

重写mysql选择以减少时间并将tmp写入磁盘

您还需要阅读以下内容:

http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html

http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/

一旦你整理了你的表设计并优化了你的innodb配置:

http://www.mysqlperformanceblog.com/2006/09/29/what-to-tune-in-mysql-server-after-installation/

http://www.mysqlperformanceblog.com/2007/11/03/choosing-innodb_buffer_pool_size/

您可以尝试以下方式:

start transaction;

insert into target_table (x,y) select x,y from source_table order by x,y;

commit;
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.