繁体   English   中英

糟糕的MySQL加入性能

[英]Poor MySQL Join Performance

我一直在尝试在MySQL中的两个表上执行连接,并且在我没有得到结果之前,查询将运行一两分钟。 我远不是数据库专家,所以我不确定我是否写得不好,如果我的MySQL设置配置不当,或者我真的应该用我的查询做其他事情。 仅供参考,数据库位于我的机器本地。

我有一个大表(约200万条记录),其中一列是一个小型表的ID(~3000条记录)。 如果这很重要,ID在大表中不是唯一的,但在小表中是唯一的。 我尝试了以下查询的各种风格,但似乎没有任何工作:

SELECT big_table.*, 
       small_table.col 
  FROM big_table 
left outer join small_table on (big_table.small_id = small_table.id)

我正在对需要所有200万行的数据进行大量分析,但不一定是在单个查询中。 以下是我的“show create table”的结果:

'big_table', 'CREATE TABLE 'big_table' (
  'BIG_ID_1', varchar(12) NOT NULL,
  'BIG_ID_2', int(100) NOT NULL,
  'SMALL_ID' varchar(8) DEFAULT NULL,
  'TYPICAL_OTHER_COLUMN' varchar(3) DEFAULT NULL,
  ...
  PRIMARY KEY ('BIG_ID_1', 'BIG_ID_2')
 ) ENGINE=MyISAM DEFAULT CHARSET=latin1'

'small_table', 'CREATE TABLE `small_table` (
  `id`, varchar(8) NOT NULL DEFAULT '''',
  `col`, varchar(1) DEFAULT NULL,
  ...
  PRIMARY KEY (`id`),
  KEY `inx_id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1'

以下是我的一个候选查询的“解释”结果:

id  select_type  table        type    possible_keys   key      key_len  ref                         rows     extra
1   SIMPLE       big_table    ALL     NULL            NULL     NULL     NULL                        1962193       
1   SIMPLE       small_table  eq_ref  PRIMARY,inx_id  PRIMARY  10       db_name.big_table.SMALL_ID  1

您在一个查询中选择了大约200万条记录。 根据每行中的数据量,您可能需要数百兆字节的数据。

你可能想尝试的事情:

  • 如果您不需要所有列,则查询所需的列而不是使用SELECT table.*
  • 查看是否可以将部分(或全部)处理移动到数据库,而不是获取数据并在客户端中处理数据。
  • 避免一次性将整个结果集读入内存。
  • 一次批量处理几千行,而不是一次取出所有行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM