MySql索引笔记
MySQL 索引是什么
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。
索引分单列索引和组合索引,单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引,组合索引,即一个索引包含多个列。
创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件),实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
上面都在说使用索引的好处,但过多的使用索引将会造成滥用,因此索引也会有它的缺点,虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
MYSQL索引类型
NORMAL:普通索引
FULLTEXT:全文索引
SPATIAL:空间索引(目前还没用过)
UNIQUE:表示唯一的,不能重复的索引,可为NULL
PRIMARY KEY:唯一索引,不能为NULL
KEY:普通非唯一索引
MYSQL索引方法
目前主要有以下几种索引方法:B-Tree,Hash,R-Tree。
B-Tree:
是最常见的索引类型,所有值(被索引的列)都是排过序的,每个叶节点到跟节点距离相等。所以B-Tree适合用来查找某一范围内的数据,而且可以直接支持数据排序(ORDER BY),B-Tree在MyISAM里的形式和Innodb稍有不同,MyISAM表数据文件和索引文件是分离的,索引文件仅保存数据记录的磁盘地址,InnoDB表数据文件本身就是主索引,叶节点data域保存了完整的数据记录。
Hash:
1.仅支持"=","IN"和"<=>"精确查询,不能使用范围查询,由于Hash索引比较的是进行Hash运算之后的Hash值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的Hash算法处理之后的Hash。
2.不支持排序:,由于Hash索引中存放的是经过Hash计算之后的Hash值,而且Hash值的大小关系并不一定和Hash运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算。
3.在任何时候都不能避免表扫描,由于Hash索引比较的是进行Hash运算之后的Hash值,所以即使取满足某个Hash键值的数据的记录条数,也无法从Hash索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。
4.检索效率高,索引的检索可以一次定位,不像B-Tree索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以Hash索引的查询效率要远高于B-Tree索引。
5.只有Memory引擎支持显式的Hash索引,但是它的Hash是nonunique的,冲突太多时也会影响查找性能。Memory引擎默认的索引类型即是Hash索引,虽然它也支持B-Tree索引。
MYSLQ索引创建
1、单列索引
1.1、普通索引,最基本最常用的索引。
CREATE INDEX IndexName ON `TableName`(`字段名`(length));
ALTER TABLE TableName ADD INDEX IndexName(`字段名`(length));
如果是字段类型是CHAR,VARCHAR,length可以小于字段的实际长度,如果是BLOB和TEXT类型就必须指定长度。
1.2、唯一索引,与普通索引类似,但是不同的是唯一索引要求所有列的值是唯一的,但是允许有空值。
CREATE UNIQUE INDEX IndexName ON `TableName`(`字段名`(length));
ALTER TABLE TableName ADD UNIQUE INDEX IndexName(`字段名`(length));
1.3、主键索引,与唯一索引类似,但是不能有空值。
主键索引建立的规则是 int优于varchar,一般在建表的时候创建,最好是与表的其他字段不相关的列或者是业务不相关的列,一般会设为 int 而且是 AUTO_INCREMENT自增类型的
2、组合索引
一个索引包含2个及以上的字段
CREATE INDEX IndexName ON `TableName`(`字段名1`(length),`字段名2`(length),`字段名3`(length));
ALTER TABLE TableName ADD INDEX IndexName(`字段名1`(length),`字段名2`(length),`字段名3`(length));
组合索引(IndexName) 那么它实际包含的是3个索引 (字段1) ,(字段1,字段2),(字段1,字段2,字段3),那么应该如何使用组合索引呢?
查询的时候遵循组合索引的【最左前缀】原则,什么是最左前缀?就是索引where时的条件要按照建立索引的时候字段的排序方式,举例说明一下:
a、不按索引最左列开始查询索引无效,例如index(‘c1’, ‘c2’, ‘c3’) ,查询条件是where ‘c2’ = ‘aaa’或者where `c2` = `aaa` and `c3`=`sss` ,这些情况索引都是无效的,where c1 = 'aaa' and c2 = 'bbb'或者where c1 = 'aaa' and c2 = 'bbb' and c3 = 'ccc'索引有效。
b、查询中某个列有范围查询,则其右边的所有列索引无效,例如index(‘c1’, ‘c2’, ‘c3’) ,查询条件是where c1= ‘xxx’ and c2 like = ‘aa%’ and c3=’sss’ ,该查询c1和c2索引有效,c3索引无效,因为like是范围查询。
c、跳过某个字段来进行查询其实和第2条一样的原理,索引无效,例如index('c1','c2','c3'),查询条件是where c1 > 1 and c2 = 2 and c3 = 3,索引无效
3、全文索引
文本字段类型是text,如果建立的是普通索引,那么只有对文本的字段内容前面的字符进行索引,其字符大小根据索引建立索引时申明的大小来规定,如果文本中出现多个一样的字符,而且需要查找的话,那么其条件只能是 where column lick '%xxxx%' 这样做会让索引失效,这个时候全文索引就发挥作用了。
CREATE FULLTEXT INDEX IndexName ON `TableName`(`字段名`);
ALTER TABLE TableName ADD FULLTEXT INDEX IndexName(`字段名`);
未完待续。。。
MySql索引笔记的更多相关文章
- mysql 索引- 笔记
索引 mysql最常用的索引结构是btree(O(log(n))),但是总有一些情况下我们为了更好的性能希望能使用别的类型的索引.hash就是其中一种选择,例如我们在通过用户名检索用户id的时候,他们 ...
- mysql 索引笔记
MyISAM引擎的B+Tree的索引 通过上图可以直接的看出, 在MyISAM对B+树的运用中明显的特点如下: 所有的非叶子节点中存储的全部是索引信息 在叶子节点中存储的 value值其实是 数据库中 ...
- mysql 索引 笔记1
#不同的存储引擎支持的索引类型也不一样 InnoDB 支持事务,支持行级别锁定,支持 B-tree.Full-text 等索引,不支持 Hash 索引: MyISAM 不支持事务,支持表级别锁定,支持 ...
- 关于Mysql索引的笔记
MySQL索引原理 索引目的 索引的目的在于提高查询效率,可以类比字典,如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql.如果没有索引,那么你可能需 ...
- mysql学习笔记-- 多表查询之外键、表连接、子查询、索引
本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...
- SQL学习笔记五之MySQL索引原理与慢查询优化
阅读目录 一 介绍 二 索引的原理 三 索引的数据结构 四 聚集索引与辅助索引 五 MySQL索引管理 六 测试索引 七 正确使用索引 八 联合索引与覆盖索引 九 查询优化神器-explain 十 慢 ...
- SQL学习笔记之MySQL索引知识点
0x00 概述 之前写过一篇Mysql B+树学习,简单的介绍了B+数以及MySql使用B+树的原因, 有了这些基础知识点,对MySql索引的类型以及索引使用的一些技巧,就比较容易理解了. 0x01 ...
- Mysql 索引复习笔记
之前学习索引后由于一直没怎么用,所以也只是粗略看了一下,最近发现索引的用处很大,并且也很多知识点,在此做复习记录. 什么是索引? 百度百科是这样描述的: 索引是为来加速对表中数据行中的检索而创建的一种 ...
- Mysql索引学习笔记
1.btree索引与hash索引 下列范围查询适用于 btree索引和hash索引: SELECT * FROM t1 WHERE key_col = 1 OR key_col IN (15,18,2 ...
随机推荐
- Winpcap笔记3之打开适配器并捕获数据包
上一讲中知道了如何获取适配的信息,这一将我们讲写一个程序蒋每一个通过适配器的数据包打印出来. 打开设备的函数是pcap_open().函数原型是 pcap_t* pcap_open(const cha ...
- Centos6可以ping通但浏览器不能上网(解决)
遇到这种情况,只需要修改一下DNS Server即可,如下图. 这样再试试,应该可以了吧-
- [软件安装]JDK
一.软件简介1.java开发.java应用的系统基础环境2.软件版本会不同有少许差异,一般是稳定上升 二.安装环境:1.时间:2017年4月5日2.系统:centos7.3 64位(阿里云)3.软件版 ...
- bzoj 3566: [SHOI2014]概率充电器【树形概率dp】
设g[u]为这个点被儿子和自己充上电的概率,f[u]为被儿子.父亲和自己充上电的概率 然后根据贝叶斯公式(好像是叫这个),1.P(A+B)=P(A)+P(B)-P(A)*P(B),2.P(A)=(P( ...
- 洛谷P3261 [JLOI2015]城池攻占(左偏树)
传送门 每一个城市代表的点开一个小根堆,把每一个骑士合并到它开始攻占的城池所代表的点上 然后开始dfs,每一次把子树里那些还活着的骑士合并上来 然后再考虑当前点的堆,一直pop直到骑士全死光或者剩下的 ...
- AJPFX总结泛型概念和使用
泛型泛型(generic)概述和基本使用 泛型把明确数据类型的操作放到创建对象或者调用方法的时候再明确. J ...
- java数据结构和算法05(二叉树)
对于树这个数据结构,第一次看到这个树肯定是一脸蒙逼,玛德,树?种树的那个树么?哈哈哈,当然不是,前面我们说过数组添加.删除数据很慢,查询数据很快:而链表添加.删除数据很快,但是查找数据很慢,我们就想啊 ...
- vue学习之遇见的问题
1.本地图片加载不出来 错误原因:图片放置位置不对: 解决方法:需要将图片放在static文件夹里
- .NET 几种数据绑定控件的区别
GridView 控件 GridView 控件以表的形式显示数据,并提供对列进行排序.分页.翻阅数据以及编辑或删除单个记录的功能. 特征:一行一条记录,就像新闻列表一样:带分页功能. DataList ...
- iOS定位--CoreLocation框架
CoreLocation框架的使用 // 首先导入头文件 #import <CoreLocation/CoreLocation.h> CoreLocation框架中所有数据类型的前缀都是C ...