1

## [MySQL]一道簡易的 Select 指令，只差了一個數字，查詢時間卻相差了200秒？

``````SELECT
recordTime,
IFNULL(FORMAT(windSpeed_10mA,2),"NAN") AS WS10,
IFNULL(FORMAT(windSpeed_30m,2),"NAN") AS WS30,
IFNULL(FORMAT(windSpeed_50m,2),"NAN") AS WS50,
IFNULL(FORMAT(windSpeed_95mA,2),"NAN") AS WS95A,
IFNULL(FORMAT(windSpeed_95mB,2),"NAN") AS WS95B,
IFNULL(FORMAT(windDirection_10mA,1),"NAN") AS WD10,
IFNULL(FORMAT(windDirection_30m,1),"NAN") AS WD30,
IFNULL(FORMAT(windDirection_50m,1),"NAN") AS WD50,
IFNULL(FORMAT(windDirection_95m,1),"NAN") AS WD95
FROM
wind_Raw
WHERE
recordTime BETWEEN '2017-12-01 00:00:01' AND '2017-12-29 00:00:00'
ORDER BY
recordTime

#wind_Raw資料表簡述：記錄每秒的風速、風向變化。一日計有8萬6千400筆資料。
``````

``````28 天的 EXPLAIN 分析結果：
id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra
1 	SIMPLE 	wind_Raw 	range 	PRIMARY,recordTime,recordTime_2,recordTime_3,recor... 	PRIMARY 	60 	NULL	2011148 	Using where

29 天的 EXPLAIN 分析結果：
id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra
1 	SIMPLE 	wind_Raw 	ALL 	PRIMARY,recordTime,recordTime_2,recordTime_3,recordTime_4 	NULL	NULL	NULL	10761191 	Using where; Using filesort
``````

dog830228 iT邦研究生 5 級 ‧ 2018-01-11 21:31:36 檢舉

SELECT
recordTime,
IFNULL(FORMAT(windSpeed_10mA,2),"NAN") AS WS10,
IFNULL(FORMAT(windSpeed_30m,2),"NAN") AS WS30,
IFNULL(FORMAT(windSpeed_50m,2),"NAN") AS WS50,
IFNULL(FORMAT(windSpeed_95mA,2),"NAN") AS WS95A,
IFNULL(FORMAT(windSpeed_95mB,2),"NAN") AS WS95B,
IFNULL(FORMAT(windDirection_10mA,1),"NAN") AS WD10,
IFNULL(FORMAT(windDirection_30m,1),"NAN") AS WD30,
IFNULL(FORMAT(windDirection_50m,1),"NAN") AS WD50,
IFNULL(FORMAT(windDirection_95m,1),"NAN") AS WD95
FROM
wind_Raw
WHERE
recordTime > '2017-12-01 00:00:00' AND recordTime <= '2017-12-29 00:00:00'

keberosx iT邦新手 5 級 ‧ 2018-01-12 08:58:51 檢舉
To 牙膏大師：該 wind_Raw 只有 recordTime 欄位是 Primary Key，因為 Primary Key 好像本身就運用索引，所以我個人是沒特別把它新增索引過，多索引的現象可能我同事自已另外加的。

=======================================================
To dog830228：使用 Between 和您提供的雙邏輯運算時間是一樣的~

01~28 或 02~29，共28天，查詢時間 15 秒
01~29 或 02~30，共29天，查詢時間 210 秒
fillano iT邦超人 1 級 ‧ 2018-01-12 09:12:12 檢舉

fillano iT邦超人 1 級 ‧ 2018-01-12 09:16:00 檢舉
https://www.kancloud.cn/taobaomysql/monthly/67180

dog830228 iT邦研究生 5 級 ‧ 2018-01-12 09:51:08 檢舉
To keberosx
My SQL我不確定，但 MSSQL 雙邏輯寫法和Between 效能上有差別
keberosx iT邦新手 5 級 ‧ 2018-01-12 09:52:57 檢舉
To fillano：感謝您提供的資訊~只是該文章內容算是提供「 MySQL 引發 Using filesort 」後的資訊文獻，屬於比較後階段的議題。

dog830228 iT邦研究生 5 級 ‧ 2018-01-12 10:07:37 檢舉
To keberosx: 請問一下 你有沒有PK索引,

keberosx iT邦新手 5 級 ‧ 2018-01-12 10:39:44 檢舉
To dog830228：wind_Raw資料表，本身就是設定 recordTime 為 Primary Key，所以確定是有索引的。且在上方的 EXPLAIN 分析結果當中，也就有顯示 Primary Key 的索引存在（索引名稱=PRIMARY），排版後如下：

28天的 EXPLAIN分析
type = range
possible_keys = PRIMARY,recordTime,recordTime_2,recordTime_3,recor...
key = PRIMARY
Extra = Using Where

29天的EXPLAIN分析
type=ALL
possible_keys =PRIMARY,recordTime,recordTime_2,recordTime_3,recor...
key=NULL
Extra =Using Where; Using filesort
dog830228 iT邦研究生 5 級 ‧ 2018-01-12 11:19:13 檢舉

keberosx iT邦新手 5 級 ‧ 2018-01-12 11:50:09 檢舉
TO dog830228：
wind_Raw 資料表，假設有兩個索引：一個是 INT，一個是 DateTime。
MySQL 在查詢時若有發現此兩個索引的存在，自身若是會去使用較快速的 INT 來當搜尋因子，此現象在效能決策上我們可視為理所當然~

keberosx iT邦新手 5 級 ‧ 2018-01-12 16:15:51 檢舉
To Everyone：

1、BETWEEN '2017-12-01 00:00:01' AND '2017-12-23 21:42:21'

2、BETWEEN '2017-12-01 00:00:01' AND '2017-12-23 21:42:22'

fillano iT邦超人 1 級 ‧ 2018-01-12 16:44:42 檢舉

https://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html#order-by-filesort-in-memory

keberosx iT邦新手 5 級 ‧ 2018-01-15 08:35:33 檢舉
To fillano：sort_buffer_size 參數我也是有調整過~不過這項參數是屬於 MySQL 引發 filesort 時，執行排序時的優化用參數。而不是避免 MySQL 引發 filesort 用的。

keberosx iT邦新手 5 級 ‧ 2018-01-16 14:52:16 檢舉
To 牙膏大師：
===回應上上則===

===回應上則===

QQ 剛剛在書上看到還能用 <https://dev.mysql.com/doc/internals/en/optimizer-tracing.html> 看到 MySQL 是如何決定要不要用 index 的，但他輸出的結果我實在是有看沒有懂，只能幫你到這了
keberosx iT邦新手 5 級 ‧ 2018-01-17 14:26:20 檢舉
To 牙膏大師：

### 2 個回答

1
haoming
iT邦好手 1 級 ‧ 2018-01-12 08:42:57

keberosx iT邦新手 5 級 ‧ 2018-01-12 09:04:35 檢舉

01~28 或 02~29，共28天，查詢時間 15 秒。
01~29 或 02~30，共29天，查詢時間 210 秒。

0
pupuliao
iT邦新手 5 級 ‧ 2018-01-12 10:47:47

datetime的索引效果很差

keberosx iT邦新手 5 級 ‧ 2018-01-12 11:34:49 檢舉

pupuliao iT邦新手 5 級 ‧ 2018-01-12 13:53:52 檢舉

keberosx iT邦新手 5 級 ‧ 2018-01-12 14:57:20 檢舉