我一直试图在某个SELECT查询上获得一些速度提升。 情况如下: 有一个(在我眼里)巨大的交叉桌。它目前有大约2000万行,但我预计这会增长很多。 根据这个交叉表,我需要创建另一个表。为此,我需要执行以下查询:
SELECT hugeCrossingTable.field3, otherTable.field1, hugeCrossingTable.field2 * otherTable.field3 AS someName
FROM hugeCrossingTable
INNER JOIN otherTable ON hugeCrossingTable.field1 = otherTable.field2
现在这导致大约一百万行。我已经在2个表中的field1上都有索引,但它仍然需要18分钟才能完成.. 我想要分割表格,但后来我需要找到一种方法来分割数据,因为它只是一个交叉表,没有想到如何做到这一点。
关于如何优化这一点的任何想法?
感谢。
根据要求,这里是创建声明:
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;
解释输出:
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'
答案 0 :(得分:21)
这里有一些innodb示例,适用于大约的大表。 6000到5亿行,展示了精心设计的innodb表的优势以及如何最好地使用聚簇索引(仅适用于innodb)
MySQL and NoSQL: Help me to choose the right one
60 million entries, select entries from a certain month. How to optimize database?
Rewriting mysql select to reduce time and writing tmp to disk
您还需要阅读以下内容:
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;
希望这有帮助。