你好 我有这两张 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";
我在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
最佳答案
EXPLAIN
和 CREATE TABLEs
都表明您拥有最好的索引,并且查询时间应该远少于一秒。
但是...
由于您使用的是 MyISAM(而不是 InnoDB),写入可能会阻塞读取,从而导致读取可能需要很长时间。同时还有什么在运行?
也许最好的解决方案是ALTER TABLE ... ENGINE=InnoDB;
。 (执行此操作时请确保有大量额外的磁盘空间。)您也可以对所有表执行此操作。
关于Mysql Join 2表非常慢,不添加其他索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38385204/