gpt4 book ai didi

mysql - 在 MySQL 上创建复合索引的正确方法

转载 作者:行者123 更新时间:2023-11-29 11:42:46 25 4
gpt4 key购买 nike

我正在尝试改进昂贵的 mysql 搜索的结果。我在 Python 中有一个查询,如下所示:

query = ("SELECT s.* "
"FROM stores_standardized ss "
"LEFT JOIN stores s "
"ON s.storeID = ss.store_ID "
"WHERE s.phone = %s "
"OR (ss.fulladdress = %s "
"AND ss.city = %s "
"AND ss.state = %s "
"AND ss.zip = %s "
"AND ss.country = %s "
"AND ss.number = %s "
"AND ss.street = %s "
"AND ss.type = %s) "
"AND ss.standardizedname = %s"
)

我知道我需要一个索引,但我很困惑应该从哪里开始索引。以下哪一个(或其他)是最好的索引?

选项 1:

create index idx 
on stores_standardized
(fulladdress,city,state,zip,country,number,street,type,standardizedname);

然后在stores_standardized 上为store_ID 建立一个单独的索引。或者将它们全部组合起来更好:

选项 2:

create index idx 
on stores_standardized
(store_ID,fulladdress,city,state,zip,country,number,street,type,standardizedname);

编辑运行解释提供以下内容:

+------+-------------+-------+--------+---------------------+---------+---------+----------------------------+---------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+-------+--------+---------------------+---------+---------+----------------------------+---------+-------------+
| 1 | SIMPLE | ss | index | name,search,search2 | search2 | 864 | NULL | 1803772 | Using index |
| 1 | SIMPLE | s | eq_ref | PRIMARY | PRIMARY | 8 | dbname.ss.store_ID | 1 | Using where |
+------+-------------+-------+--------+---------------------+---------+---------+----------------------------+---------+-------------+

最佳答案

在这种特殊情况下,我相信唯一可以帮助此查询的索引位于每个表的 store_ID 字段上; WHERE 条件中的 OR 几乎可以消除索引的使用;另外,您的 X OR (Y) AND Z 条件看起来有点含糊。

提高性能的最佳方法是将其分成单独的相似查询(每个查询都包含 OR 的一部分)并将这些查询合并在一起。 UNION 将消除任何重复的结果,然后您可以利用每个部分的单独索引;一个索引位于phone上,另一个索引位于(部分)具有AND条件的字段列表上;哪些字段最合适将根据您预期的数据分布而有所不同。

关于mysql - 在 MySQL 上创建复合索引的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35490735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com