我想建立一個新的表,使現有表中的值不包含在另一個表中(但明顯包含以下檢查)。以下是我的表結構:重寫這個子查詢?
mysql> explain t1;
+-----------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| point | bigint(20) unsigned | NO | MUL | 0 | |
+-----------+---------------------+------+-----+---------+-------+
mysql> explain whitelist;
+-------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+---------+----------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| x | bigint(20) unsigned | YES | | NULL | |
| y | bigint(20) unsigned | YES | | NULL | |
| geonetwork | linestring | NO | MUL | NULL | |
+-------------+---------------------+------+-----+---------+----------------+
我的查詢看起來是這樣的:
SELECT point
FROM t1
WHERE EXISTS(SELECT source
FROM whitelist
WHERE MBRContains(geonetwork, GeomFromText(CONCAT('POINT(', t1.point, ' 0)'))));
解釋:
+----+--------------------+--------------------+-------+-------------------+-----------+---------+------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+--------------------+-------+-------------------+-----------+---------+------+------+--------------------------+
| 1 | PRIMARY | t1 | index | NULL | point | 8 | NULL | 1001 | Using where; Using index |
| 2 | DEPENDENT SUBQUERY | whitelist | ALL | _geonetwork | NULL | NULL | NULL | 3257 | Using where |
+----+--------------------+--------------------+-------+-------------------+-----------+---------+------+------+--------------------------+
查詢花費6秒在T1執行了1000條記錄這是我無法接受。如果我沒有要加入的列,我該如何使用Joins重寫此查詢(或者如果存在更快的方法)?我猜在最壞的情況下,即使是存儲過程也是可以接受的。我的目標是最終創建一個包含t1條目的新表。有什麼建議麼?
是否地理網有一個空間索引呢?如果沒有,那麼添加一個應該有所幫助。 – YWE 2010-10-04 21:48:02
@YWE:Yeap。 explain命令中顯示的MUL用於空間索引。 – Legend 2010-10-04 21:49:49
只是好奇,你最終做了什麼來解決你的問題? – Snekse 2011-03-16 15:28:14