2017-06-14 84 views
0

我有一個表的街道地址數據,包含約1400萬條記錄。我試圖尋找併爲此目的,我創建了幾個索引。我正在運行查詢是:MySQL的查詢和索引

SELECT * 
    from ADDRESSES 
    WHERE number_first = 538 
    AND street_name IN ('COLL', 'COLLA', 'COLLABY HILL', 'COLLACE', 
     'COLLAERY','COLLANDA','COLLANILLING','COLLARD','COLLARE', 
     '[plus about another 100+ street names]') 
    AND locality_name in ('MERRIMAC', 'ST ANDREWS', 'WARWICK', 'HORSHAM', 
     'WARNERTOWN','BRUNSWICK','FAIRY MEADOW','RUSSELL VALE', 'CARRAMAR', 
     '[plus about another 500+ locality names]') 

我已經創建STREET_NAME上和number_first索引如下:(street_name(4),number_first

作爲LOCALITY_NAME也被包括在該查詢中,我創建另一個索引如下: (number_firststreet_namelocality_name

運行解釋其對SELECT查詢總是選擇的第一個索引,而不是第二個。如何修改我的查詢/索引,以便我可以根據street_name,locality_name和number_first進行搜索。

PS:我使用MySQL的版本是45年5月5日

+1

爲什麼你想要使用特定的索引?你確定你比數據庫引擎更好的知道它會導致更快的執行嗎?有時使用索引比不使用它慢。 –

+0

我只是想明白,爲什麼具有street_name和locality_name的索引被覆蓋,只有部分street_name – user2260040

+0

我懷疑number_first將有較小的價值變化。可能會有一個新的'street_name,locality_name,number_first'索引。 – ajreal

回答

0

,因爲它是複合指數。 重組指數(左匹配) 這就是爲什麼只有第一個指數

0

考慮下面的比賽:

CREATE TABLE addresses 
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,number_first INT NOT NULL 
,street_name INT NOT NULL 
,locality_name INT NOT NULL 
,INDEX(number_first,street_name,locality_name) 
); 

CREATE TABLE temp_streetname(streetname INT NOT NULL PRIMARY KEY); 

CREATE TABLE temp_localityname(localityname INT NOT NULL PRIMARY KEY); 

SELECT COUNT(0) FROM addresses; 
+----------+ 
| COUNT(0) | 
+----------+ 
| 4194304 | 
+----------+ 

SELECT COUNT(*) FROM temp_streetname; 
+----------+ 
| COUNT(*) | 
+----------+ 
|  117 | 
+----------+ 

SELECT COUNT(*) FROM temp_localityname; 
+----------+ 
| COUNT(*) | 
+----------+ 
|  563 | 
+----------+ 

SELECT a.* 
    FROM addresses a 
    JOIN temp_localityname x 
    ON x.localityname = a.locality_name 
    JOIN temp_streetname y 
    ON y.streetname = a.street_name 
WHERE a.number_first = 538; 
+---------+--------------+-------------+---------------+ 
| id  | number_first | street_name | locality_name | 
+---------+--------------+-------------+---------------+ 
| 1910930 |   538 |  1287 |   829 | 
| 2964907 |   538 |  1322 |   1001 | 
+---------+--------------+-------------+---------------+ 
2 rows in set (0.04 sec) 

所以在這裏我們有一個地址表由4個百萬行,對綜合指數(number_first,STREET_NAME,LOCALITY_NAME)。

我們還有分別包含117和563行的「臨時」街道名稱和地點表。 (我的意思是「暫時的」,我不打算長時間保留它們,而不是技術意義上的更強)。

我已經用隨機整數填充了所有表格 - 但原理是相同的,不管數據類型如何。

正如您所看到的,對這些表執行的查詢只需不到半秒。