优化mysql索引的问题

时间:2018-10-19 10:04:55

标签: mysql query-performance

我有一个大约有150万行的mysql表。 该表包含一个名为companies (integer)的列,其中包含几个不同的值(3或4),另一个名为orders (varchar)的列中包含许多不同的值(但有些相同)。

我用列companiesorders创建了一个多列索引(类型INDEX)。

我有一个简单的查询

SELECT * FROM TABLE1 WHERE companies = 1 AND orders = '344A7884'

当我在已实现或未实现索引的情况下执行此查询时,没有执行时间差(大约4秒)。

我发现获得大约1秒执行时间的唯一方法是仅在“订单”上创建索引并运行以下转换后的查询:

SELECT * FROM (SELECT * FROM TABLE1 WHERE orders = 34467884) RQ1 WHERE companies = 1

这似乎不是很恰当。 有人可以向我解释这种奇怪的行为,并提出优化索引的更好方法吗?

2 个答案:

答案 0 :(得分:1)

如果索引列是VARCHAR,请针对没有引号的数字进行测试。例如,如果companiesVARCHAR(99)

companies = 1  -- will scan the entire table (slow)
companies = '1'  -- can use the index (fast)

为进一步讨论,请提供SHOW CREATE TABLEEXPLAIN SELECT ...

如果companiesINT,而ordersVARCHAR,则

WHERE companies = 1 AND orders = '344A7884'

与以下任意一个 一起使用都可以非常快地工作:

INDEX(companies, orders)
INDEX(orders, companies)

答案 1 :(得分:0)

在第一次创建索引时肯定是一个错误。将再次测试,看看是否再次出现此问题。 感谢您的评论。