これは SO への私の最初の質問です。
このクエリの例は、テキサス州ダラスから 30 マイルの範囲内の車を検索するものです。検索する行を制限するために境界ボックスを使用しています。
問題:
クエリがキャッシュされる前に、23,600 件の結果を取得するのに約 20 秒かかります。境界ボックス内で検索できるのは 411 行だけのようです。これは本当に速いはずではありませんか?
なぜそれがとても遅いのかについてのアイデアはありますか? これを改善する方法について何か提案はありますか? 私は何か間違ったことをしていますか?
クエリ:
SELECT Make, Model
FROM cars
WHERE MBRCONTAINS( GEOMFROMTEXT( 'Polygon(( 32.4800138808 -97.1620371512, 33.0933687128 -97.1620371512, 33.0933687128 -96.4324293136,
32.4800138808 -96.4324293136, 32.4800138808 -97.1620371512 ))' ) ,g )
出力の説明:
+----+-------------+---------+-------+---------------+------+---------+------+------+------
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+-------+---------------+------+---------+------+------+-----
| 1 | SIMPLE | carscom | range | g | g | 34 | NULL | 411 | Using where |
+----+-------------+---------+-------+---------------+------+---------+------+------+------
このテーブルには約 120 万行あります。
関連する列とインデックスを含むテーブル構造を次に示します。実際のテーブルには、より多くの列といくつかのインデックスがあります。
CREATE TABLE IF NOT EXISTS `cars` (
`Latitude` float(10,7) NOT NULL,
`Longitude` float(10,7) NOT NULL,
`Make` varchar(20) NOT NULL,
`Model` varchar(50) NOT NULL,
`g` geometry NOT NULL,
KEY `LatLon` (`Latitude`,`Longitude`),
SPATIAL KEY `g` (`g`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
列 に空間キーがありますg
。
g
列にデータを入力し、空間インデックスを配置する SQL は次のとおりです。
UPDATE `cars` SET `g` = GeomFromText(CONCAT('POINT(',`Latitude`,' ',`Longitude`,')'));
ALTER TABLE `cars` ADD SPATIAL KEY `g` (`g`);
最初に 411 行だけを検索するのに時間がかかる理由がわかりません。空間列とキーに何か問題がありますか?
ご協力いただきありがとうございます。
更新: MySQL サーバーは 5.1.70 で、サーバーには 16GB のメモリがあります。また、my.cnf ファイルを編集して、skip-host-cache と skip-name-resolve を含め、MySQL サーバーを再起動しました。
更新 2、プロフィール情報:
Starting 7 µs
Checking Query Cache For Query 42 µs
Checking Permissions 2 µs
Opening Tables 8 µs
System Lock 2 µs
Table Lock 5 µs
Init 15 µs
Optimizing 5 µs
Statistics 39 µs
Preparing 13 µs
Executing 2 µs
Sending Data 163 µs
End 3 µs
Query End 1 µs
Freeing Items 15 µs
Logging Slow Query 1 µs
Cleaning Up 2 µs