代码之家  ›  专栏  ›  技术社区  ›  Michael McGowan

MySQL连接性能差

  •  3
  • Michael McGowan  · 技术社区  · 15 年前

    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             
    1 回复  |  直到 15 年前
        1
  •  4
  •   Mark Byers    15 年前

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

    您可能想尝试的事项:

    • 如果不需要所有列,则查询需要的列,而不是使用 SELECT table.* .
    • 查看是否可以将部分(或全部)处理移到数据库中,而不是提取数据并在客户机中进行处理。
    • 一次处理几千行,而不是一次获取所有行。