我在我的CENTOS服务器上的mysql 5.6上运行了以下查询
select tb1.field2, tb1.field1, tb2.field1
from dns.table1 tb1, dns.table2 tb2
where tb1.field2 = tb2.field2
and tb1.field1 != tb2.field1所有相关列都被编入索引。对于有1000万行的表,它在400秒内完成,但是在1亿行上,它在10小时内完成!
表模式:
CREATE TABLE `my_table` (
`table_id` bigint(20) NOT NULL AUTO_INCREMENT,
`field2` varchar(255) NOT NULL,
`field1` varchar(255) DEFAULT NULL,
`field3` longtext,
`updated_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`table_id`),
UNIQUE KEY `field2` (`field2`),
KEY `field1` (`field1`)
) ENGINE=InnoDB
AUTO_INCREMENT=1
DEFAULT CHARSET=utf8
ROW_FORMAT=COMPRESSED
KEY_BLOCK_SIZE=8 |这两个无害的表的大小是相等的。
为什么?我怀疑mysql内部的文件交换,在mysql上可以优化什么?增加缓冲池会有帮助吗?
发布于 2015-03-01 01:23:37
复合INDEX(field2, field1)将是一个“覆盖”指数。这将避免大量的查找,从而使其更快。注意:如果您也选择field3,这将不起作用。(在这种情况下,InnoDB和MyISAM都会受益。)
保留您的UNIQUE(field2)是因为唯一性约束。
https://dba.stackexchange.com/questions/94088
复制相似问题