我很茫然。我有一個約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