我不確定你是否已經解決了這個問題,但是這裏有一些我已經制作的測試數據。有很多因素會影響查詢的速度,所以我的簡單測試用例可能無法準確反映您的表或數據。但是,它們是一個有用的起點。
首先,創建5個簡單的表格,每個表格具有相同的結構。至於你的表格,我使用了一個UNIQUE
指數在url
列:
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
指數,從而保證沒有兩個網址將是相同的(見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
列上有索引,您的查詢應該是會非常快。
是索引的url字段?什麼是「tfdata.web」? – 2010-06-29 07:10:39
@Lasse V. Karlsen ....對不起,這是一個錯誤,我糾正它 – mathew 2010-06-29 07:21:53
和mysql_error是... – Leo 2010-06-29 07:23:49