MySQL查询和索引

MySQL查询和索引,mysql,sql,Mysql,Sql,我有一个包含街道地址数据的表,包含约1400万条记录。我正在尝试搜索,为此,我创建了一些索引。我正在运行的查询是: SELECT * from ADDRESSES WHERE number_first = 538 AND street_name IN ('COLL', 'COLLA', 'COLLABY HILL', 'COLLACE', 'COLLAERY','COLLANDA','COLLANILLING','COLLARD','COLLARE

我有一个包含街道地址数据的表,包含约1400万条记录。我正在尝试搜索,为此,我创建了一些索引。我正在运行的查询是:

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]' )
我已经在街道名称和编号上创建了一个索引,如下所示:(
街道名称
(4),
编号

由于查询中还包括Location_name,我创建了另一个索引,如下所示: (
number\u first
street\u name
locality\u name

在SELECT查询上运行EXPLAIN总是选择第一个索引,而不是第二个索引。如何修改查询/索引,以便首先根据街道名称、地点名称和编号进行搜索


PS:我使用的MySQL版本是5.5.45,因为它是重组索引。 重组指数(左匹配)
这就是为什么它只匹配第一个索引的原因考虑以下几点:

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)
这里我们有一个地址表,包含400万行,上面有一个复合索引(number\u first,street\u name,locality\u name)

我们还有街道名称和地点的“临时”表格,分别包含117行和563行。(我的意思是“暂时的”,我不打算把它们保留很长时间,而不是更专业的意义)

我已经用随机整数填充了所有的表,但原理是一样的,不管数据类型如何


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

为什么要使用特定索引?您确定您比数据库引擎更清楚它会导致更快的执行吗?有时使用索引比不使用索引慢。我只是想了解,为什么只有部分街道名称的索引会被覆盖,而只有部分街道名称的索引会被覆盖。我怀疑首先使用数字名称的索引会有较小的值变化。可能会有一个新的索引,即
街道名称、地点名称、编号\u优先
。您可以将相应的数组存储在“临时”索引中tables@Strawberry-你能再详细一点吗?谢谢