我有一个大约有150万行的mysql表。
该表包含一个名为companies (integer)
的列,其中包含几个不同的值(3或4),另一个名为orders (varchar)
的列中包含许多不同的值(但有些相同)。
我用列companies
和orders
创建了一个多列索引(类型INDEX)。
我有一个简单的查询
SELECT * FROM TABLE1 WHERE companies = 1 AND orders = '344A7884'
当我在已实现或未实现索引的情况下执行此查询时,没有执行时间差(大约4秒)。
我发现获得大约1秒执行时间的唯一方法是仅在“订单”上创建索引并运行以下转换后的查询:
SELECT * FROM (SELECT * FROM TABLE1 WHERE orders = 34467884) RQ1 WHERE companies = 1
这似乎不是很恰当。 有人可以向我解释这种奇怪的行为,并提出优化索引的更好方法吗?
答案 0 :(得分:1)
如果索引列是VARCHAR
,请不针对没有引号的数字进行测试。例如,如果companies
是VARCHAR(99)
,
companies = 1 -- will scan the entire table (slow)
companies = '1' -- can use the index (fast)
为进一步讨论,请提供SHOW CREATE TABLE
和EXPLAIN SELECT ...
如果companies
是INT
,而orders
是VARCHAR
,则
WHERE companies = 1 AND orders = '344A7884'
与以下任意一个 一起使用都可以非常快地工作:
INDEX(companies, orders)
INDEX(orders, companies)
答案 1 :(得分:0)
在第一次创建索引时肯定是一个错误。将再次测试,看看是否再次出现此问题。 感谢您的评论。