Database 板


LINE

※ 引述《kaiyuegg (蛋頭)》之銘言: : 大家好~! : MYSQL VER.5.0.51b-community-nt-log : 我最近在研究系統效能部分(有關於 mysql date index 沒反應)... : 遇到了一些問題! : 我一般在處理日期部分 都是直接這樣下的 : select * from `salary` where DATE < '2013-09-15' : 但有時候筆數多的時候就算DATE 設 index : mysql explain 的type 也是 all (索引沒發揮作用) : 這樣效能很差 所以在找方法讓它變快。 : 如果設 : select * from salary where DATE between '2013-05-10' and '2014-09-29' : explain 出來 type 才會變成 range : (索引有發生作用 但是好像要設到資料裡面的上限跟下限裡面才有作用) : 如果資料裡面包含 0000-00-00 想要抓不包含0000-00-00的資料想要這樣下 : select * from salary where DATE between '1970-01-01 and '2050-12-31' : 這時候explain 出來 就變成all 了(索引就沒發生作用了) : 下 != or <> 0000-00-00 也會變成all : 結論 : 1.想請問大家 mysql 在日期欄位上面 index 的正確用法? : 2.如上面所述 我想要抓不是0000-00-00 的資料 用什麼方法可以讓index 產生效用? : 可能說的不是很清楚...但就是date 在 mysql 的索引好像不是那麼友善? : 請大大指點迷津 或是提示一下 我不清楚的部分 tks 首先你要知道 INDEX 是另外存的 也佔空間 也吃 FILE IO 也就是說 透過 INDEX 其實不一定比較快 例如你有一個 TABLE 總共佔了 10000 個 block 然後建了一個 index , 這個 index 本身佔了 2000 個 block 假設你今天要找的資料 在整個 table 的 10000 個 blocks 裡, 散布在其中的 9000 個 blocks 裡面。 這時候 你透過 index 找資料的 IO 成本就會是 2000 + 9000 = 11000 而 Full Table Scan 的 IO 成本只有 10000 像這樣的時候, DBMS 就會選擇直接做 Table Scan 因為成本比較低。 那 DBMS 怎麼知道哪條路成本比較低呢 就來自它本身對這些 表格/索引 的統計值 以 Oracle 舉例 跟這樣行為有關的參數就包括有 1. 最佳化器嘗試組出最佳路徑的嘗試次數上限 2. 最佳化器判斷 走 index 的成本 大於 Full Table Scan 成本的多少比例以上 就走 Full Scan 3. 最佳化器優化的方向(最小IO , 最快回應等 回到你提的問題 從你下的參數中我們可以注意到幾件事 1. 在你指定的範圍內資料量較小的時候 DBMS 會覺得該走 index 2. 在你指定的範圍內資料量較大的時候 DBMS 選擇走 FULL SCAN 3. 你下了 select * 這代表所有不在INDEX上的欄位,DBMS都必須要翻 DATA BLOCKS出來才能拿到資料 但是在你的資料中 0000-00-00 的資料量到底有多少? 如果只有很小一點點 (或是 DBMS 覺得它只佔一點點 那麼使用 FULL SCAN 是很正常的。 反正你都得翻這些資料出來,何必脫褲子放屁去 index blocks 再繞一圈呢? 但是如果 這樣的資料是佔多數的 那或許是你的表格/索引的統計值出問題了。導致 DBMS 覺得這樣比較快 * 有另一個狀況 就是 DBMS 在處理 function(col) 這些操作的時候 因為存在 index 裡的資料是 col 而非 function(col) 所以 DBMS 會覺得這個 index 是與需求不符的 會放棄 ** 然後 資料量大的話 會慢是正常的啊 有吃 IO 吃CPU 就有開銷就是要花工夫啊 你只能避免它繞冤枉路 該走的路還是免不了的 ---- 會看執行計畫之後的下一步就是算執行成本 加油啊~ --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 122.118.6.179 jeamie:轉錄至某隱形看板 09/17 22:51 ※ 編輯: iFEELing 來自: 122.118.6.179 (09/17 23:02)
1F:推 kaiyuegg:感謝回應~我也有了觀念的釐清! 09/19 13:08
2F:→ kaiyuegg:先講0000-00-00是大約佔七成...當我把它改成1000-01-01 09/19 13:08
3F:→ kaiyuegg:索引就發揮作用了~! 09/19 13:09
4F:→ kaiyuegg:但我有一個不解想請問i大~! 索引在我認知裡面以為是一張 09/19 13:09
5F:→ kaiyuegg:排序不同但一樣大小的table 請問一下 10000 block 索引 09/19 13:10
6F:→ kaiyuegg:不是 10000 而是大約 2000 block 我這部分不太清楚 09/19 13:10
7F:→ kaiyuegg:可以請i大說明一下嗎?~謝謝您 09/19 13:11
8F:→ iFEELing:完全不是這樣的喔 索引是TREE 不是表格 只記特定欄位 09/19 15:10







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Boy-Girl站內搜尋

TOP