2017-06-14 90 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行的“临时”街道名称和地点表。 (我的意思是“暂时的”,我不打算长时间保留它们,而不是技术意义上的更强)。

我已经用随机整数填充了所有表格 - 但原理是相同的,不管数据类型如何。

正如您所看到的,对这些表执行的查询只需不到半秒。