MySQL查询和索引
我有一个包含街道地址数据的表,包含约1400万条记录。我正在尝试搜索,为此,我创建了一些索引。我正在运行的查询是: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
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-你能再详细一点吗?谢谢