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` AFTER UPDATE ON `girl1`
FOR EACH ROW BEGIN
IF new.rank BETWEEN 10 AND 100 THEN
REPLACE girl1_filtered_index VALUES (new.id,new.rank);
ELSE
DELETE FROM girl1_filtered_index WHERE id = old.id;
END IF;
END;
$$
DELIMITER ;
DELIMITER $$
USE `t_girl`$$
DROP TRIGGER /*!50032 IF EXISTS */ `filtered_delete`$$
CREATE
/*!50017 DEFINER = 'root'@'localhost' */
TRIGGER `filtered_delete` AFTER DELETE ON `girl1`
FOR EACH ROW BEGIN
DELETE FROM girl1_filtered_index WHERE id = old.id;
END;
$$
DELIMITER ;
OK,我们导入测试数据。
ytt>load data infile 'girl1.txt' into table girl1 fields terminated by ',';
Query OK, 100000 rows affected (1.05 sec)
Records: 100000 Deleted: 0 Skipped: 0 Warnings: 0
ytt>select count(*) from girl1;
+----------+
| count(*) |
+----------+
| 100000 |
+----------+
1 row in set (0.04 sec)
ytt>select count(*) from girl1_filtered_index;
+----------+
| count(*) |
+----------+
| 640 |
+----------+
1 row in set (0.00 sec)
这里,我们把查询语句修改成基础表和条件索引表的JOIN。
select a.id,a.rank from girl1 as a where a.id in (select b.id from girl1_filtered_index as b where b.rank between 20 and 60) limit 20;