Mysql Join 2表非常慢,不添加其他索引

标签 mysql performance select join

你好 我有这两张 table :

  • recording_log(recording_id、lead_id、长度、文件名、位置)
  • vicidial_list(lead_id, 电话号码)

当我将这个查询放入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";

这就是我在解释中的内容: enter image description here

我在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 

最佳答案

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

但是...

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

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

More tips and caveats .

关于Mysql Join 2表非常慢,不添加其他索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38385204/

相关文章:

java - 如何在 Java 射线追踪器中实现多线程

sql - 选择起始线,其中 geom 返回不同的 geom

python - 在 Python 中排序的最快方法(没有 cython)

html - 通用选择器对性能有何影响?

MySQL 你如何插入一个带有返回多行的 SELECT 子查询的表?

delphi - 在 Delphi TStringGrid 中检测单选与多选

mysql - 是否可以指示 libmysqld(嵌入式 MySql 数据库引擎)使用内存数据库?

c# - 在 C# GUI 应用程序中将远程 Mysql 数据库同步到本地

mysql - SQL 和 UTF-8(SQL 脚本)

Mysql UPDATE ON DUPLICATE KEY 仅插入