作者KC73 (肯先生)
看板Database
标题Re: [MySQL ] 捞日期的问题
时间Thu May 21 15:27:37 2009
※ 引述《TonyQ (沉默是金)》之铭言:
: ※ 引述《vitolee (毅)》之铭言:
: : 今天我的资料储存方式如下
: : Class 使用人数 Date
: : A 43 2009/05/09 18:04:25
: 如果是 datetime 栏位 , 可以直接用 hour 来作判断比较直觉.
: 像你要 18点间上课的资料 , 就可以写
: SELECT * FROM `table_date` WHERE hour( date ) =18
建议用 explain 看一下,即使把 Date 设定了 index,应该还会有一个
full table scan,资料一多,就很慢:
mysql> explain SELECT * FROM t WHERE HOUR(date)='6'\G
Connection id: 14782064
Current database: xxxx
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 1735
Extra: Using where
1 row in set (0.00 sec)
用 substring 也是一样的结果:
mysql> explain SELECT * FROM t WHERE substring(`Date`,12,2)='18'\G
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 14784890
Current database: xxxx
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 1735
Extra: Using where
1 row in set (0.01 sec)
所以建议你把 hour 额外放一个栏位,搜寻的时候,用 hour 那个栏位
去搜就好,当然,也要事先设定好 index:
mysql> explain SELECT * FROM t WHERE hour=6\G
Connection id: 14782312
Current database: xxxx
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t
type: ref
possible_keys: hour
key: hour
key_len: 1
ref: const
rows: 39
Extra:
1 row in set (0.00 sec)
mysql>
这只是要证明一下 date 有设 index 的:
mysql> explain SELECT * FROM t WHERE date BETWEEN '2009-05-18 00:00:00' AND '2009-05-18 12:00:00'\G
Connection id: 14782658
Current database: xxxx
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t
type: range
possible_keys: Date
key: Date
key_len: 8
ref: NULL
rows: 10
Extra: Using where
1 row in set (0.00 sec)
mysql>
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.116.151.252
※ 编辑: KC73 来自: 122.116.151.252 (05/21 15:35)
1F:推 TonyQ:感谢分享o(_ _)o 05/21 16:42
2F:推 kylekai:基本上只要对栏位做了 function 处理.都会造成table scan. 05/21 17:44
3F:→ KC73:对呀!所以那些 function,最好都不要放在 WHERE 後面。 05/21 18:06
然後 mysql 的 index 有点麻烦。
栏位在 index 的前後顺序,还有栏位会不会拿来排序,对效能的影响都很大;
index 设定多了以後,INSERT (或 UPDATE、REPLACE) 的速度就会变慢。
一开始最好每个 SELECT 都拿来 EXPLAIN 一次。
※ 编辑: KC73 来自: 122.116.151.252 (05/21 18:18)