【发布时间】:2010-10-04 21:33:19
【问题描述】:
我正在尝试构建一个新表,以使现有表中的值不包含在另一个表中(但显然以下检查是否包含)。以下是我的表结构:
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 |
+----+--------------------+--------------------+-------+-------------------+-----------+---------+------+------+--------------------------+
查询在 t1 中执行 1000 条记录需要 6 秒,这对我来说是不可接受的。如果我没有要加入的列,如何使用 Joins 重写此查询(或者如果存在更快的方法)?我猜在最坏的情况下,即使是存储过程也是可以接受的。我的目标是最终创建一个包含 t1 条目的新表。有什么建议吗?
【问题讨论】:
-
地理网络上是否有空间索引?如果没有,那么添加一个应该会有所帮助。
-
@YWE:是的。解释命令中显示的 MUL 用于空间索引。
-
只是好奇,你最终做了什么来解决你的问题?
标签: sql mysql database query-optimization