我不确定您是否解决了问题,但这是我制作的一些测试数据。有许多因素会影响您的查询速度,因此我的简单测试用例可能无法准确反映您的表或数据。但是,它们可以作为一个有用的起点。
首先,创建 5 个简单的表,每个表都具有相同的结构。与您的表格一样,我在 url 列上使用了 UNIQUE 索引:
CREATE TABLE `table1` (
`id` int(11) NOT NULL auto_increment,
`url` varchar(255) default NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `url` (`url`)
) ENGINE=InnoDB;
CREATE TABLE table2 LIKE table1;
CREATE TABLE table3 LIKE table1;
CREATE TABLE table4 LIKE table1;
CREATE TABLE table5 LIKE table1;
以下脚本创建一个存储过程,用于在每个表中填充 10,000 行数据:
DELIMITER //
DROP PROCEDURE IF EXISTS test.autofill//
CREATE PROCEDURE test.autofill()
BEGIN
DECLARE i INT DEFAULT 5;
WHILE i < 10000 DO
INSERT INTO table1 (url) VALUES (CONCAT('wwww.stackoverflow.com/', i ));
INSERT INTO table2 (url) VALUES (CONCAT('wwww.stackoverflow.com/', 10000 - i ));
INSERT INTO table3 (url) VALUES (CONCAT('wwww.stackoverflow.com/', i + 6000 ));
INSERT INTO table4 (url) VALUES (CONCAT('wwww.stackoverflow.com/', i + 3000 ));
INSERT INTO table5 (url) VALUES (CONCAT('wwww.stackoverflow.com/', i + 2000 ));
SET i = i + 1;
END WHILE;
END;
//
DELIMITER ;
CALL test.autofill();
现在每个表都包含 10,000 行。您的SELECT 语句现在可用于查询数据:
SELECT *
FROM table1,table2,table3,table4,table5
WHERE table1.url = table2.url
AND table1.url = table3.url
AND table1.url = table4.url
AND table1.url = table5.url
AND table1.url = 'wwww.stackoverflow.com/8000';
这几乎立即给出了以下结果:
+------+-----------------------------+------+-----------------------------+------+-----------------------------+------+-----------------------------+------+-----------------------------+
| id | url | id | url | id | url | id | url | id | url |
+------+-----------------------------+------+-----------------------------+------+-----------------------------+------+-----------------------------+------+-----------------------------+
| 7996 | wwww.stackoverflow.com/8000 | 1996 | wwww.stackoverflow.com/8000 | 1996 | wwww.stackoverflow.com/8000 | 4996 | wwww.stackoverflow.com/8000 | 5996 | wwww.stackoverflow.com/8000 |
+------+-----------------------------+------+-----------------------------+------+-----------------------------+------+-----------------------------+------+-----------------------------+
EXPLAIN SELECT 说明了查询速度非常快的原因:
EXPLAIN SELECT *
FROM table1,table2,table3,table4,table5
WHERE table1.url = table2.url
AND table1.url = table3.url
AND table1.url = table4.url
AND table1.url = table5.url
AND table1.url = 'wwww.stackoverflow.com/8000';
+----+-------------+--------+-------+---------------+------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+-------+---------------+------+---------+-------+------+-------------+
| 1 | SIMPLE | table1 | const | url | url | 258 | const | 1 | Using index |
| 1 | SIMPLE | table2 | const | url | url | 258 | const | 1 | Using index |
| 1 | SIMPLE | table3 | const | url | url | 258 | const | 1 | Using index |
| 1 | SIMPLE | table4 | const | url | url | 258 | const | 1 | Using index |
| 1 | SIMPLE | table5 | const | url | url | 258 | const | 1 | Using index |
+----+-------------+--------+-------+---------------+------+---------+-------+------+-------------+
select_type 是SIMPLE,这意味着没有JOIN 语句可以减慢速度。
type 是 const,这意味着该表最多有一个可能的匹配项 - 这要归功于 UNIQUE 索引,它保证没有两个 URL 会相同(请参阅 mysql 5.0 indexes - Unique vs Non Unique UNIQUE INDEX 的描述)。 type 列中的 const 值与您所能得到的一样好。
possible_keys 和 key 使用 url 键。这意味着每个表都使用了正确的索引。
ref 是const,这意味着 MySQL 正在将一个常量值(一个不变的值)与索引进行比较。同样,这非常快。
rows 等于 1。MySQL 只需要从每个表中查看一行。再一次,这非常快。
Extra 是 Using index。 MySQL 不必对表进行任何额外的非索引搜索。
如果您在每个表的 url 列上都有索引,那么您的查询应该非常快。