ããã©ã¼ãã³ã¹ãæ±ãã¦
çµå±ãããã£ããã¨ã¯ã 次ã®4ã¤ã
- index ãã å®ä½ã¸ã®ã·ã¼ã¯ã¯é ãã
- ãã¹ã¦ãindexå ã§å®çµããã¯ã¨ãªã¼ã¯æ©ãã
- limit ãã¤ãã¦ã where ã order by ããã¨æå³ããªãã
- indexãå¼µããªã Using indexe ãã²ããã§ããªãã¨è² ãããªã
ã§ã¯ãselect ã§åå¾ããå¤ãã¹ã¦ã« index ãå¼µãã¾ãã? å ´åã«ãã£ã¦ã¯å¯è½ã§ããããã¼ãã«ã«æååãªããããµãã ãã«å«ã¾ãã¦ããã¨é£ãããã®ããããç¾å®çã§ã¯ããã¾ããã
ããã§ãããªæ¹æ³ãææ¡ãã¾ãã2段éã«ããã¦ã¯ã¨ãªã¼ãæã¡ã¾ãã
A.
task ãã¼ãã«ã® 2008/6/5 ã 2008/6/18 ã®ãã¼ã¿ãéå§æ¥é ã«ãªãã¹ã¦ãå
é 5件ã ã表示ããã
select SQL_CALC_FOUND_ROWS * from task where task.task_starttime <= '2008/6/18' and task.task_endtime >= '2008/6/5' order by task.task_starttime limit 0,5; 5 rows in set (8.73 sec)
explain
+----+-------------+-------+-------+-----------------+-----------------+---------+------+--------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+-----------------+-----------------+---------+------+--------+-------------+ | 1 | SIMPLE | task | index | index_task_time | index_task_time | 18 | NULL | 100192 | Using where | +----+-------------+-------+-------+-----------------+-----------------+---------+------+--------+-------------+
å½ç¶ãªããã8.73 sec㨠ã¯ã½ã®ããã«é
ãã§ãã
ãã®ã¯ã¨ãªã¼ãé«éåãã¾ãã
B.
select * ã ãã©ã¤ããªã¼ãã¼ã® select task_key ã«å¤æ´ãã¾ãã
select SQL_CALC_FOUND_ROWS task_key from task where task.task_starttime <= '2008/6/18' and task.task_endtime >= '2008/6/5' order by task.task_starttime limit 0,5; 5 rows in set (0.03 sec)
explain
+----+-------------+-------+-------+-----------------+-----------------+---------+------+-------+--------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+-----------------+-----------------+---------+------+-------+--------------------------+ | 1 | SIMPLE | task | range | index_task_time | index_task_time | 9 | NULL | 50096 | Using where; Using index | +----+-------------+-------+-------+-----------------+-----------------+---------+------+-------+--------------------------+
ãã®ã¯ã¨ãªã¼ã®çµæã®ããã«ãªãã¾ããã +----------+ | task_key | +----------+ | 26783 | | 61433 | | 88226 | | 92431 | | 95981 | +----------+
次ã«ãã®é çªã«ãã¼ã¿ãåå¾ãã¾ãã
ãã®é çªã¯ order by ãããå
容ã§ãããã絶対ã«å¤æ´ãã¦ã¯ããã¾ããã
ãã®é çªã«ãã¼ã¿ãåå¾ããã«ã¯ã©ãããã°ãããã§ãããã?
3ã¤ã®æ¡ãããã¾ãã
1.
ã²ã¨ã¤ã¥ã¤åãåºã㦠phpç ã§ãã¼ã¸ã
select * from task where task_key = 26783
DBã¨ã®äº¤ä¿¡åæ°ããã£ãããªãã®ã§æ²¡
2.
UNION ALL ã§ã¯ã¨ãªã¼ãçµåããã
select * from task where task_key = 26783 UNION ALL select * from task where task_key = 61433 UNION ALL select * from task where task_key = 88226 ... 以ä¸ç¥
1ããæ£è§£ã«è¿ããã ãã©ãè¡æ°ãé·ããªãã®ã¨ãçµå±ã¯æ¯åã¯ã¨ãªã¼ãçºè¡ãã¦ããã®ã§mysqlã«ãããããªãã®ã§æ²¡ãããã²ã¨ããã°ãã
3.
http://q.hatena.ne.jp/1189526421 ã«ããã order by ã§ä¸¦ã³æºãæå®ã§ãããããããããå¿ç¨ãã
select * from task where task_key in (26783,61433,88226,92431,95981) order by case when 26783 then 1 when 61433 then 2 when 88226 then 3 when 92431 then 4 when 95981 then 5 end;
ãã¹ããã§ã¤ã¹!(ã¨ã¹ãã¬ãã½ã®ããã«ããããã¹ããã§ã¤ã¹)
C.
3ã®æ¹æ³ã§åãåããããã¦è¦ã¾ãã
select * from task where task_key in (26783,61433,88226,92431,95981) order by case when 26783 then 1 when 61433 then 2 when 88226 then 3 when 92431 then 4 when 95981 then 5 end; 5 rows in set (0.00 sec)
explain
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+ | 1 | SIMPLE | task | range | PRIMARY | PRIMARY | 4 | NULL | 5 | Using where | +----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
ã§ãã¾ãã!!
select SQL_CALC_FOUND_ROWS task_key from task where task.task_starttime <= '2008/6/18' and task.task_endtime >= '2008/6/5' order by task.task_starttime limit 0,5; 5 rows in set (0.03 sec) select * from task where task_key in (26783,61433,88226,92431,95981) order by case when 26783 then 1 when 61433 then 2 when 88226 then 3 when 92431 then 4 when 95981 then 5 end; 5 rows in set (0.00 sec)
å¦çã«ããã£ãæéã¯ã 0.03 sec + 0.00 sec = 0.03 sec ã¨çæ©ã§ãã
indexãªã | 1.02 sec |
indexã ã | 8.73 sec |
2éã¯ã¨ãª | 0.03 sec |
å·®ã¯æ´ç¶ã§ãã
mysqlãå©ç¨ãã¦ãã¦ã¯ã¨ãªã¼ãé
ãã¦æ©ãã§ãã人ã¯è©¦ãã¦ã¿ã¦ã¯ã©ãã§ãããã?
ä½è«ã§ãããmysqlã« postgresql ã® oid ã®ãããªãã®ãå°å ¥ããããã ãã©ã¤ããªã¼ãã¼ã®ä»£ããã«å©ç¨ããã¨ãã£ã¨é度ããããã¨æãã¾ãã
以ä¸ãææã§çºè¡¨ããå
容ãããæ¯ãæãã¦æãã¦æãã¾ãã£ããã¼ã¸ã§ã³ããåæ§ã«ãå®å¿ã§ãã
ééãããã£ããæãã¦ããã¯ãã