1

私はテーブルを持っています

CREATE TABLE tb_incident (
  id int(10) unsigned NOT NULL AUTO_INCREMENT,
  what tinyint(4) NOT NULL,
  when bigint(20) unsigned NOT NULL,
  where tinytext NOT NULL,
  where_longitude_latitude point NOT NULL,
  who tinyint(4) DEFAULT NULL,
  why tinyint(4) DEFAULT NULL,
  description text,
  created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY id_UNIQUE (id),
  KEY index_main_items (what,when),
  SPATIAL KEY location_index (where_longitude_latitude)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

このクエリを実行しようとすると、

SELECT db_incident.distance(point(132.6,15.604436765987833),where_longitude_latitude,'mi') AS "Distance in miles", 
X(where_longitude_latitude) AS "Longitude", 
Y(where_longitude_latitude) AS "Latitude" 
FROM db_incident.tb_incident 
WHERE db_incident.distance(point(132.6,15.604436765987833),where_longitude_latitude,'mi') <= 5
LIMIT 100

実行に 10 分以上かかります。時々、このエラーError Code: 2013. Lost connection to MySQL server during query が表示されます。

私のテーブルには 1,000 万を超えるレコードがあります。誰かが見て、クエリを最適化できる方法があるかどうかを確認してください。

注: db_incident.distance は、2 点間の距離を返す関数です。

以下は、クエリのEXPLAINです。

+----+-------------+-------------+------+---------------+------+---------+------+----------+-------------+
| id | select_type | table       | type | possible_keys | key  | key_len | ref  | rows     | Extra       |
+----+-------------+-------------+------+---------------+------+---------+------+----------+-------------+
|  1 | SIMPLE      | tb_incident | ALL  | NULL          | NULL | NULL    | NULL | 11689629 | Using where |
+----+-------------+-------------+------+---------------+------+---------+------+----------+-------------+
1 row in set (0.00 sec)
4

0 に答える 0