【问题标题】:Mysql Join 2 tables very slow without adding other indexesMysql Join 2表很慢,不加其他索引
【发布时间】:2016-11-18 00:29:08
【问题描述】:

你好 我有这两张桌子:

  • recording_log(recording_id, lead_id ,length, filename ,location )
  • vicidial_list(lead_id, phone_number )

当我将此查询放在 sql 控制台中时,它似乎很慢(> 5 分钟)

SELECT vc.phone_number, vc.lead_id, rl.location, rl.filename FROM `recording_log` as rl 
INNER JOIN vicidial_list as vc ON vc.lead_id=rl.lead_id 
WHERE vc.phone_number="000021125454" aND length > "550";

这是我在 EXPLAIN 中的内容:

我在recording_log(lead_id) 中有索引 并在vicidial_list(lead_id)

CREATE TABLE recording_log (
    recording_id int(10) unsigned NOT NULL AUTO_INCREMENT, 
    filename varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, 
    lead_id int(9) unsigned DEFAULT NULL, 
    user varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL, 
    vicidial_id varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL, 
    PRIMARY KEY (recording_id), 
    KEY filename (filename), 
    KEY lead_id (lead_id), 
    KEY user (user), 
    KEY vicidial_id (vicidial_id)
) ENGINE=MyISAM AUTO_INCREMENT=3417340;

CREATE TABLE vicidial_list (
    lead_id int(9) unsigned NOT NULL AUTO_INCREMENT, 
    phone_number varchar(18) COLLATE utf8_unicode_ci NOT NULL, 
    list_id bigint(14) unsigned NOT NULL DEFAULT '0', 
    PRIMARY KEY (lead_id), 
    KEY phone_number (phone_number), 
    KEY list_id (list_id)
) ENGINE=MyISAM AUTO_INCREMENT=3531081 

【问题讨论】:

  • 你有多少行?除非你有一张大桌子,否则五分钟似乎不太可能。请发布您的表格创建语句并注明行数
  • 谢谢回复,我有 > 3M 行,这显示创建表 stat..CREATE TABLE recording_log (recording_id int(10) unsigned NOT NULL AUTO_INCREMENT, filename varchar(100)整理 utf8_unicode_ci 默认空值,lead_id int(9) 无符号默认空值,user varchar(20) 整理 utf8_unicode_ci 默认空值,vicidial_idvarchar(20) 整理 utf8_unicode_ci 默认空值,主键 (@98) 987654334@ (filename), KEY lead_id (lead_id), KEY user (user), KEY vicidial_id (vicidial_id) ENGINE=MyISAM AUTO=341734
  • 这适用于 vicidial_list ;创建表vicidial_list (lead_id int(9) unsigned NOT NULL AUTO_INCREMENT, phone_number varchar(18) COLLATE utf8_unicode_ci NOT NULL, list_id bigint(14) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (@987654346 @), KEY phone_number (phone_number), KEY list_id (list_id) ) ENGINE=MyISAM AUTO_INCREMENT=3531081
  • 有趣的是,您的 CREATE TABLE 语句没有显示查询中出现的长度列 :)

标签: mysql performance select join


【解决方案1】:

EXPLAINCREATE TABLEs 都表示您拥有最好的索引,查询时间应该少于一秒。

不过……

由于您使用的是 MyISAM(而不是 InnoDB),因此写入可能会阻塞读取,因此读取可能需要很长时间。同时还有什么在运行?

也许最好的解决方案是ALTER TABLE ... ENGINE=InnoDB;。 (在执行此操作时请确保有大量额外的磁盘空间。)您也可以对所有表执行此操作。

More tips and caveats.

【讨论】:

    猜你喜欢
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 2012-06-26
    • 2012-02-01
    • 2015-12-31
    • 2015-08-26
    相关资源
    最近更新 更多