MySQL模拟条件索引

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

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

时间: 2024-05-20 04:01:05

MySQL模拟条件索引的相关文章

浅谈PHP开发中MySQL数据库索引的经验

假如我们创建了一个testIndex表:CREATE TABLE testIndex(i_testID INT NOT NULL,vc_Name VARCHAR(16) NOT NULL); 我们随机向里面插入了1000条记录,其中有一条    i_testID    vc_Name      555    erquan     在查找vc_Name="erquan"的记录SELECT * FROM testIndex WHERE vc_Name='erquan';时,如果在vc_Na

详解MySQL数据库索引的选择性

在MySQL中,对于索引的使用并是一直都采用正确的决定. 简单表的示例: create TABLE `r2` ( ID` int(11) DEFAULT NULL, ID1` int(11) DEFAULT NULL, CNAME` varchar(32) DEFAULT NULL, KEY `ID1` (`ID1`) ) ENGINE=MyISAM DEFAULT charSET=latin1 select count(*) FROM r2; 250001 (V1) select count(

mysql数据库索引损坏及修复经验分享

  这篇文章主要介绍了mysql数据库索引损坏及修复经验分享,需要的朋友可以参考下 mysql表索引被破坏的问题及解决 下午上班,惊闻我的dedecms的网站出问题了,访问一看,果然全屏报错,检查mysql日志,错误信息为: Table '.dedecmsv4dede_archives' is marked as crashed and should be repaired 提示说cms的文章表dede_archives被标记有问题,需要修复.于是赶快恢复历史数据,上网查找原因.最终将问题解决.

MySQL数据库索引使用方法

  走向精通MySQL的道路非常的艰难,还好各种关系型数据库大同小异,足够让我从增删改查上升到高性能数据库的架构和调优.这期间的各种概念就不絮叨了,我也很难表述的很清楚,昨天写了个小脚本往我本机MySQL数据库的某张表里面注入了200万条数据(Windows7旗舰版/1.66GHz/2G内存/MySQL5.1.50),数据表的结构如下图所示,属于一个比较基本的定长表,考虑到我可怜的本本的承受能力,id使用从1开始的自增,title字段为随机20个标题中的一个,content都是相同的内容,tim

用MySQL建立索引时数据表怎样建立?

问题描述 用MySQL建立索引时数据表怎样建立? 长度的字符串位置,大致是这样: 字符串 位置 |ABCD| {1.1,1.11,3.6,...} | |BCDC| {1.2,3.7,...} | |CDCD| {1.3,...} | |.... | {...} | (比如:搜索ABCD,返回{1.1,1.11,3.6}) 我打算将固定长度的字符串作为关键字,位置作为数据. 我知道MySQL里的游标逐条处理数据,但是怎么用原始数据建立数据表?需要什么?希望有人指导一下,万分 解决方案 你这个是全

深入分析MySQL数据库索引

什么是索引 索引是存储引擎用于快速找到记录的一种数据结构,索引类似一本书的目录,我们根据目录可以快速的查找到我们感兴趣的内容.索引就是存储引擎的目录,如果没有索引存储引擎必须遍历整个数据库表来查询符合条件的记录,索引的建立和优化应该是提升查询性能最有效的手段了. 索引的类型 索引是在MYSQL的存储引擎层中实现的,而不是在服务层实现的.所以每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的索引类型.即使多个存储引擎支持同一种类型的索引,其底层实现也可能不同. B-Tree索引

mysql 组合索引的实现原理是什么?

问题描述 mysql 组合索引的实现原理是什么? 在网络上看到资料了解到 mysql 的索引使用 B-tree 实现的,使用关键字来存储索引的列. 单列的索引是使用一个 B-tree 的方式实现的. 但是,网上的大多资料都没有提及,组合索引的具体实现. 我个人猜测组合索引也是使用一个 B-tree 来实现,其中关键字同时存储的是多个列的. B-tree 根据多个列进行排序.这样正好可以很好地解释"最左前缀". 不知道我的猜测是否正确?!!! 解决方案 MySql 的索引实现原理 解决方

MySql 创建索引原则

为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索引和创建什么类型的索引.本小节将向读者介绍一些索引的设计原则.   1.选择唯一性索引   唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录.例如,学生表中学号是具有唯一性的字段.为该字段建立唯一性索引可以很快的确定某个学生的信息.如果使用姓名的话,可能存在同名现象,从而降低查询速度.   2.为经常需要排序.分组和联合操作的字段建立索引   经常需要ORDER BY.GROUP BY.DISTINCT和UNION等操

MySQL 查询索引的选择性、索引字段、注释等基本信息的SQL

链接:http://blog.itpub.net/28602568/viewspace-1819474/ 标题: MySQL 查询索引的选择性.索引字段.注释等基本信息的SQL 作者:lōττéry版权所有[文章允许转载,但必须以链接方式注明源地址,否则追究法律责任.] 如下sql 用于统计mysql数据库非系统db的全部表/索引信息  (包括:数据库.表名.表注释.表行数.表大小.索引名.索引字段.字段注释.基数.选择性比.索引类型..) SQL:      SELECT t.table_sc