日期:2014-05-16 浏览次数:21179 次
Table "ytt.girl1"
Column | Type | Modifiers
--------+---------+--------------------
id | integer | not null
rank | integer | not null default 0
Indexes:
"girl1_pkey" PRIMARY KEY, btree (id)
"idx_girl1_rank" btree (rank) WHERE rank >= 10 AND rank <= 100
执行的查询语句为:
select * from girl1 where rank between 20 and 60 limit 20;
用了全部索引的查询计划:
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------
Limit (cost=0.29..36.58 rows=20 width=8) (actual time=0.024..0.054 rows=20 loops=1)
-> Index Scan using idx_girl1_rank on girl1 (cost=0.29..421.26 rows=232 width=8) (actual time=0.023..0.044 rows=20 loops=1)
Index Cond: ((rank >= 20) AND (rank <= 60))
Total runtime: 0.087 ms
(4 rows)
Time: 1.881 ms
用了条件索引的查询计划:
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------
Limit (cost=0.28..35.54 rows=20 width=8) (actual time=0.036..0.068 rows=20 loops=1)
-> Index Scan using idx_girl1_rank on girl1 (cost=0.28..513.44 rows=291 width=8) (actual time=0.033..0.061 rows=20 loops=1)
Index Cond: ((rank >= 20) AND (rank <= 60))
Total runtime: 0.106 ms
(4 rows)
Time: 0.846 ms
ytt>show create table girl1_filtered_index;
+----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| girl1_filtered_index | CREATE TABLE `girl1_filtered_index` (
`id` int(11) NOT NULL,
`rank` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `idx_rank` (`rank`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
接下来,对基础表的更新操作做下修改,创建了三个触发器。
DELIMITER $$
USE `t_girl`$$
DROP TRIGGER /*!50032 IF EXISTS */ `filtered_insert`$$
CREATE
/*!50017 DEFINER = 'root'@'localhost' */
TRIGGER `filtered_insert` AFTER INSERT ON `girl1`
FOR EACH ROW BEGIN
IF new.rank BETWEEN 10 AND 100 THEN
INSERT INTO girl1_filtered_index VALUES (new.id,new.rank);
END IF;
END;
$$
DELIMITER ;
DELIMITER $$
USE `t_girl`$$
DROP TRIGGER /*!50032 IF EXISTS */ `filtered_update`$$
CREATE
/*!50017 DEFINER = 'root'@'localhost' */
TRIGGER `filtered_update` AFTE