2009-08-19 1905 views
4

我試圖優化相對較大的MySQL(myisam)表220,000行。桌子本身並不大 - 大小約爲23.5MB。那麼,真正的問題是什麼? - 我有這樣的查詢:如何在where子句中優化mysql date_format()以提高速度?

SELECT * FROM table WHERE DATE_FORMAT(date_field, '%m%d') = '1128' LIMIT 10 

我試圖設置DATE_FIELD的指數,而是要解釋表明,該指數不使用在所有...我想這是因爲DATE_FORMAT不那麼陌生()。所以,我打算添加另一列,將日期保存爲'%m%d'並在其上放置索引。我不想做這件事的唯一原因是因爲數據重複。
順便說一句我用DATE_FIELD是一個出生日期字段,我敢肯定,我總是需要DATE_FIELD爲%Y-%間%d或剛剛%M%d

你對如何優化查詢更好的建議以上 ?提前致謝 !!!

一些信息:

MySQL的版本:在996.783Mhz
RAM奔騰III(Coppermine的):512MB DDR
硬盤:80GB SATA

5.0.51b日誌
OS:Slackware的12.1
CPU

PS我試圖添加保存日期爲%米%d另一列。結果非常好,但我仍然不喜歡這種方法。我在等待更多建議!

回答

2

如果你總是需要在一年通配符,像您的查詢那裏,我不知道,MySQL將能夠在一個日期/時間字段使用索引

如果這些都只有日期,你可以然而,創建一個time_dimension表,並預先填充下一個幾年的日曆。如果你需要的話,我有一個存儲過程。

create table time_dimension (
dbdate date primary key, 
year int NOT NULL, 
month int NOT NULL , 
day int NOT NULL, 
KEY(year), 
KEY(month); 
KEY(day); 
); 

您會將您的大數據表加入此相對較小的表並在其字段上進行過濾。例如

SELECT * FROM data_table d 
    inner join time_dimension t 
    on d.date_field=t.dbdate 
where t.day=28 and t.month=11 LIMIT 10 

這利用了對小time_dimension的過濾,並且date_field = dbdate上的連接通常會使用索引。

+0

感謝您的建議號!我不認爲這對我的情況非常有用(我插入了一些筆記),但總的來說這是一個很好的方向! – plamen 2009-08-19 19:10:49

+0

對未來也有好處。如果您需要過濾所有星期四,則只需向time_dimension添加另一列,然後使用where t.dayname ='Thursday'。或在一個月內所有周末將成爲其中t.year = 2009和t.month = 9,t.weekend_flag = 1 :-) – nos 2009-08-19 19:15:09

+0

與出生日期打交道時,除非該數據庫向嬰兒面向並不能真正幫助。 – jmucchiello 2009-08-19 19:22:00