mysql中能够使用索引的典型场景

mysql 演示数据库:http://downloads.mysql.com/docs/sakila-db.zip

匹配全值



explain select * from rental where rental_date=‘2005-05-25 17:22:10‘ and inventory_id=373 and customer_id=343

匹配值的范围查询



explain select * from rental where customer_id >= 373 and customer_id<400

匹配最左前缀



仅仅使用索引中的最左列进行查询,比如:在col1+col2+col3字段上的联合索引中,能够使用的索引情况可以有:col1 (col2+col3) ,col1+col2+col3。不能被使用的索引:col2 (col2+col3) 等情况。以payment表为例

alter table payment add index idx_payment_date (payment_date,amount,last_update);

explain select * from payment where payment_date=‘2006-02-14 15:16:03‘ and last_update=‘2006-02-15 22:12:32‘\G;

explain select * from payment where amount=3.98 and last_update=‘2006-02-15 22:12:32‘\G;

仅仅对索引进行查询



mysql中能够使用索引的典型场景

时间: 06-25

mysql中能够使用索引的典型场景的相关文章

高性能MySQL中的三星索引

高性能MySQL中的三星索引 我对此提出了深深的疑问: 一星:相关的记录指的是什么??(相关这个词很深奥,“相关部门”是什么部门) 二星:如果建立了B-Tree(B+Tree)索引,数据就有序了.三星:索引的列包含了查询需要所有的列?根本不需要在where查询条件所有的列上建立索引! 我认为一星和二星的rows应该是columns,索引不关具体的数据行,只与查询的列有关.这样也与High Performance MySQL 后面提到的多列索引的观点相符合,特别是二星评估. 个人的观点: 评估一个

mysql btree与hash索引的适用场景和限制

btree索引: 如果没有特别指明类型,多半说的就是btree索引,它使用btree数据结构来存储数据,大多数mysql引擎都支持这种索引,archive引擎是一个例外,5.1之前这个引擎不支持任何索引,5.1开始才支持单列自增的索引.innodb使用b+tree=btree(btree已经不使用了) 存储引擎以不同的方式使用btree索引,性能也各不相同,各有优劣,如:myisam使用前缀压缩技术使得索引更小(但也可能导致连接表查询性能降低),但innodb则按照原数据格式进行存储,再如:my

MYSQL中的普通索引,主健,唯一,全文索引区别

MYSQL索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录.表里面的记录数量越多,这个操作的代价就越高.如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置.如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍. 总体分析 PRIMARY, INDEX, UNIQUE 这3种是一类 PRIMARY 主键. 就

MySQL中的函数索引(Generated Column)及一次SQL优化

MySQL 中是没有 Oracle 的函数索引功能的,把 MySQL 的 Generated Column 称为"函数索引"并不准确,但可以和函数索引达到同样的效果,也有人把这个特性称为"衍生列". Generated Column 是什么 Generated Column 的值是根据其定义的表达式所计算而来的,下面使用官方文档中的例子做个简单介绍. 有一张表存储直角三角形的三条边长,大家都知道,根据直角三角形的边长公式,斜边的长度可以通过另外两条边长计算得到,这样

MySQL中B+树索引的使用

1)         不同应用中B+树索引的使用 对于OLTP应用,由于数据量获取可能是其中一小部分,建立B+树索引是有异议时的 对OLAP应用,情况比较复杂,因为索引的添加应该是宏观的而不是微观的. 2)         联合索引 对表上多个列进行索引.联合索引的创建方法与多个索引创建的方法一样.不同之处在于有多个索引页 CREATE TABLE t( a INT, b INT, PRIMARY KEY(a), KEY idx_a_b(a,b) )ENGINE=INNODB 从本质上来说,联合

mysql 存在索引但不能使用索引的典型场景

以%开头的LIKE查询不能够利用B-tree索引 explain select * from actor where last_name like '%NI%'\G; explain select * from actor where last_name like 'NI%'\G; 解决办法 先扫描索引 last_name获取满足条件的%NI%的主键actor_id列表,之后根据主键回表去检索记录,这样访问避开了全表扫描actor表产生的大量IO请求. explain select * from

Mysql中的联合索引、前缀索引、覆盖索引

索引 索引是一种特殊的文件,它们包含着对数据表里所有记录的引用指针.更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度. 联合索引 又名复合索引,由两个或多个列的索引.它规定了mysql从左到右地使用索引字段,对字段的顺序有一定要求.一个查询可以只使用索引中的一部分,更准确地说是最左侧部分(最左优先).如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效. CR

mysql中关于关联索引的问题

情况描述:在MySQL的user表中,对a,b,c三个字段建立联合索引,那么查询时使用其中的2个作为查询条件,是否还会走索引? 根据查询字段的位置不同来决定,如查询a,     a,b    a,b,c    a,c   都可以走索引的,其他条件的查询不能走索引. 组合索引 有“最左前缀”原则.就是只从最左面的开始组合,并不是所有只要含有这三列存在的字段的查询都会用到该组合索引. 验证过程如下所示: 首先,在SQLyog中建立一个user表,如下图所示: 对中间3个字段(user_name,us

sql server与mysql 中创建唯一索引

/*筛选索引 SQL SERVER 2008 测试*//* 应用:用户表,通过ID可以登录, 如果有电话号码也可以登录,但此时必须保证电话号码唯一.*/--1,创建测试表CREATE TABLE T( ID VARCHAR(20) NOT NULL PRIMARY KEY, MOBILE VARCHAR(20)NULL) --2,创建索引 唯一,非聚集索引(并添加筛选条件)CREATE UNIQUE NONCLUSTERED INDEX [IDX_MOBILE] ON [dbo].[T] ( [