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 ...
随机推荐
- CCF 201409-1 相邻数对 (水题)
问题描述 给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1. 输入格式 输入的第一行包含一个整数n,表示给定整数的个数. 第二行包含所给定的n个整数. 输出格式 输出一个整数,表示值正好 ...
- mysql 安装命令
mysqld install MySQL --defaults-file="D:\worksoft\mysql-5.7.17-winx64\my-default.ini" D:\w ...
- -------Pokemon Master------很水-------
A - Pokemon Master Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Submit Sta ...
- [POI2008]POD Subdivision of Kingdom
Description 给出一个具有N个结点的无向图,将其分成两个集合S1,S2. 这两个集合的点的个数一样多,但连接它们的边最少. Input 第一行给出数字N,M,代表有N个点,M条边. 下面M行 ...
- [POI2008]激光发射器SZK
Description 多边形相邻边垂直,边长为整数,边平行坐标轴.要在多边形的点上放一些激光发射器和接收器.满足下列要求: 1发射器和接收器不能放置在同一点: 2发射器发出激光可以沿壁反射,最终到达 ...
- hdu 1025 Constructing Roads In JGShining's Kingdom
本题明白题意以后,就可以看出是让求最长上升子序列,但是不知道最长上升子序列的算法,用了很多YY的方法去做,最后还是超时, 因为普通算法时间复杂度为O(n*2),去搜了题解,学习了一下,感觉不错,拿出来 ...
- 题解报告:hdu 1166 敌兵布阵(线段树or树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头 ...
- 支付宝添加scheme的方法
点击项目名称,点击“Info”选项卡,在“URL Types”选项中,点击“+”,在“URL Schemes”中输入“myAlipay”.“myAlipay”来自于文件“APViewControlle ...
- 关于JTable的使用
JTable是个JavaSwing中的表格控件,可以用来显示数据和编辑数据.这里讲一下我的使用心得. JavaSwing讲究MVC理念,而这个JTable也可以说是个迷你的MVC模型.JTable只是 ...
- React.js 简介
React.js 是一个帮助你构建页面 UI 的库.如果你熟悉 MVC 概念的话,那么 React 的组件就相当于 MVC 里面的 View.如果你不熟悉也没关系,你可以简单地理解为,React.js ...