我很茫然。我有一个约100K行的桌子。查询此表时结果通常很快,大约2ms左右。但是每当我使用ORDER BY的表现会像一块石头一样下降到大约120ms。我读了MySQL ORDER BY Optimization页面,但我不能说我明白了一切。特别是指标不清楚。优化ORDER BY查询
最后,我想运行下面的查询:
SELECT *
FROM `affiliate_new_contracts`
WHERE phone_brand IN ('Apple','Blackberry','HTC','LG','Motorola','Nokia',
'Samsung','Sony Ericsson')
AND contract_length IN ('12','24')
AND (addon IS NULL OR addon IN('Telfort Sms 300','Surf & Mail'))
AND (plan_name = 'Telfort 100'
AND
credible_shop = 1
)
ORDER BY average_price_per_month ASC, phone_price_guestimate DESC,
contract_length ASC;
不过,我会很高兴,如果我理解的基本原则。
删除先前查询中的ORDER BY子句使其运行时间为20ms而不是120ms。我在average_price_per_month
字段上有一个索引,但是将ORDER BY子句简化为ORDER BY average_price_per_month
并没有提高性能。我不明白。我也对所谓的多列索引在黑暗中应该能够帮助我进行最终查询。
任何帮助,将不胜感激。我如何让这个坏男孩表演?还是那个追求乌托邦?
的CREATE TABLE
语法如下:
$ show create table affiliate_new_contracts;
CREATE TABLE `affiliate_new_contracts` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`plan_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`contract_length` int(11) DEFAULT NULL,
`phone_brand` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`price` float DEFAULT NULL,
`average_price_per_month` float DEFAULT NULL,
`phone_price_guestimate` float DEFAULT NULL,
`credible_shop` tinyint(1) DEFAULT '0',
`addon` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`addon_price` float DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `index_affiliate_new_contracts_on_plan_name` (`plan_name`),
KEY `index_affiliate_new_contracts_on_average_price_per_month` (`average_price_per_month`),
KEY `index_affiliate_new_contracts_on_price` (`price`)
) ENGINE=InnoDB AUTO_INCREMENT=2472311 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
BTW此表重新每周和在此期间未更新。
我重新格式化了查询以避免水平滚动条。最后几个查询条件(计划名称和可信商店)与查询的其余部分(其他条款不使用表名称)不一致,并且实际上不需要它们周围的括号。我辩论是否解决它没有评论...并决定不要。如果您决定使这些条款保持一致,我会删除此评论。 – 2010-11-20 17:53:52
优秀的评论。部分查询被生成(更多证据我很不适合查询)。我删除了多余的表名。 – harm 2010-11-20 18:27:52