mysql之多列索引
mysql的多列索引是经常会遇到的问题,怎样才能有效命中索引,是本文要探讨的重点。
多列索引使用的Btree,也就是平衡二叉树。简单来说就是排好序的快速索引方式。它的原则就是要遵循左前缀索引。
多个索引从左边往右都使用上,才能使用到整个多列索引。
下面我先建立一个简单的表做实验:
create table t6 (
c1 char(1) not null default '',
c2 char(1) not null default '',
c3 char(1) not null default '',
c4 char(1) not null default '',
c5 char(1) not null default '',
key(c1,c2,c3,c4,c5)
) engine myisam charset utf8;
再分别insert into一些数据。
分别做以下一些查询:
1.
explain select * from t6 where c1='a' and c2='b' and c4>'a' and c3="c" \G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t6
type: range
possible_keys: c1
key: c1
key_len: 12
ref: NULL
rows: 2
Extra: Using where
1 row in set (0.00 sec)
这里使用到了c1,c2,c3,c4索引,特别c4是一个范围查询,所以type为range,依次c1,c2,c3被命中索引。
2.
explain select * from t6 where c1='a' and c4='a' order by c3,c2 \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t6
type: ref
possible_keys: c1
key: c1
key_len: 3
ref: const
rows: 2
Extra: Using where; Using filesort
1 row in set (0.00 sec)
过程中先命中了c1,然后在order by c3,c2的时候由于先去use c3做排序,从而联合索引断了。using filesort表明没有使用到多列合索引,而是做了文件内排序。
3.
explain select * from t6 where c1='a' and c4='a' order by c2,c3 \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t6
type: ref
possible_keys: c1
key: c1
key_len: 3
ref: const
rows: 2
Extra: Using where
1 row in set (0.00 sec)
反之命中c1索引后,先用c2排序,再是c3来排序,分别命中,最后是c4='a'做where查询,使用到了多列索引。
mysql之多列索引的更多相关文章
- mysql优化-----多列索引的左前缀规则
索引优化策略 :索引类型 .1B-tree索引 关注的是:Btree索引的左前缀匹配规则,索引在排序和分组上发挥的作用. 注:名叫btree索引,大的方面看都用的二叉树.平衡树.但具体的实现上,各引擎 ...
- mysql 最左匹配 联合索引
mysql建立多列索引(联合索引)有最左前缀的原则,即最左优先,如: 如果有一个2列的索引(col1,col2),则已经对(col1).(col1,col2)上建立了索引:如果有一个3列索引(col1 ...
- MySQL数据库中的索引(二)——索引的使用,最左前缀原则
上文中,我们了解了MySQL不同引擎下索引的实现原理,在本文我们将继续探讨一下索引的使用以及优化. 创建索引可以大大提高系统的性能. 第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性. ...
- Mysql的列索引和多列索引(联合索引)
转自:http://blog.chinaunix.net/uid-29305839-id-4257512.html 创建一个多列索引:CREATE TABLE test ( id ...
- 正确理解Mysql的列索引和多列索引
MySQL数据库提供两种类型的索引,如果没正确设置,索引的利用效率会大打折扣却完全不知问题出在这. CREATE TABLE test ( id INT NOT NULL, last_ ...
- mysql 多列索引的生效规则
mysql中 myisam,innodb默认使用的是 Btree索引,至于btree的数据结构是怎样的都不重要,只需要知道结果,既然是索引那这个数据结构最后是排好序:就像新华字典他的目录就是按照a,b ...
- mysql多列索引和最左前缀
数据库的索引可以加快查询速度,原因是索引使用特定的数据结构(B-Tree)对特定的列额外组织存放,加快存储引擎(索引是存储引擎实现)查找记录的速度.索引优化是数据库优化的最重要手段. 如果查询语句使用 ...
- mysql多列索引优化
“把Where条件里面的列都建上索引”,这种说法其实是非常错误的! 这样一个查询,假设actor_id与film_id都单独建立索引 SELECT film_id , actor_id FROM sa ...
- mysql索引之五:多列索引
索引的三星原则 1.索引将相关的记录放到一起,则获得一星 2.如果索引中的数据顺序和查找中的排列顺序一致则获得二星 3.如果索引中的列包含了查询中的需要的全部列则获得三星 多列索引 1.1.多个单列索 ...
随机推荐
- 还在等待漫长的iOS构建过程?来试试通过命令行的方式进行iOS应用快速构建和运行吧
不必多言,Xcode慢得很是众所周知的了.更甚者是,我有时发觉自己太依赖于Cocoa Touch的自动完成功能了,这可是个天使和魔鬼的结合体! 故此我开始去寻觅一个替代的流程来通过命令行来实现我需要的 ...
- Installshield停止操作系统进程的代码 --IS6及以上版本适用
原文:Installshield停止操作系统进程的代码 --IS6及以上版本适用 setup.rul的代码 Code;end;///////////////////////////////////// ...
- Oracle查字符集查版本号
原文:Oracle查字符集查版本号 ---查字符集 select * from nls_database_parameters ---查版本 查看oracle的版本信息 (1)用客户端连接到数据库,执 ...
- Asterisk 未来之路3.0_0003
原文:Asterisk 未来之路3.0_0003 Asterisk: The Hacker's PBX 如果电信公司忽视了asterisk,那么正在处于危险中.asterisk 良好的扩展性,能够创建 ...
- jQueryRotate 转盘抽奖代码实现
代码如下: 例子兼容IE6,7,8 以及高版本浏览器,如有bug请回复! 1.html结构 <!doctype html> <html lang="en"> ...
- javascript 动态创建tip图片提示
前言: 在做前端的项目中,经常看到移动一个小图标上显示这个图标对应的大图的提示,之前的做法是在小图标的位置后面添加一个div,然后移动到小图标然后显示这个图标的图片!但是这个方法做的时候发现,如果提示 ...
- Ninject的项目情况
Ninject的项目情况 首先,它有很多的项目组成,适合不同的环境,当然它有几个基本的核心库. 为什么它会有这么多的库呢?因为轻量级,易于使用和被扩展是它的目标,代码越是少,你使用代码的可能性越高嘛. ...
- LaTex代码生成器
latex代码生成器 希腊字母 \alpha \beta \gamma \delta \epsilon \zeta \eta \theta \iota \kappa \lambda \mu \nu \ ...
- flume安装及配置
Flume安装 介绍 Flume本身的安装比较简单(flume的介绍请参考http://blog.csdn.net/rzhzhz/article/details/7448633),安装前先说明几个概念 ...
- U盘安装Win7
声明:本方法仅仅适用于windows 7 的安装. 工具准备: 1.网上下载一个windows 7 系统.最好是纯净版的,非Gost 版.虽然装机慢了一些,但到用时就体会到他的流畅. 2.Window ...