展会信息港展会大全

mysql数据库模拟条件索引
来源:互联网   发布日期:2016-01-27 15:43:18   浏览:1380次  

导读:我们知道,MySQL 不支持条件索引。 什么是条件索引呢? 条件索引就是在索引列上根据WHERE条件进行一定的过滤后产生的索引。 这样的索引有以下优势:strong Table ytt girl1Column | Type ...

我们知道,MySQL 不支持条件索引。 什么是条件索引呢? 条件索引就是在索引列上根据WHERE条件进行一定的过滤后产生的索引。 这样的索引有以下优势:

<strong>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</strong>

<strong>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)</strong>

<strong>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;</strong>

赞助本站

人工智能实验室

相关热词: 条件索引 mysql 数据库

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港