MySQL 索引 INDEX
索引用于快速找出在某列中有特定值的行。
不使用索引,MySQL必须从第一条记录开始读完整个表,直到找到相关的行,表越大,查询数据所花费的时间就越多,如果表中查询的列有一个索引,MySQL能够快速到达一个位置去搜索数据文件,而不必查看所有数据,那么将会节省很大一部分时间。
MySQL中的索引的存储类型有两种:BTREE和HASH
索引的分类:
索引是在存储引擎中实现的,即不同的存储引擎会使用不同的索引:
MyISAM和InnoDB存储引擎:只支持BTREE索引,即默认使用BTREE索引且不能更换。
MEMORY存储引擎: 支持BTREE索引和HASH索引
索引可分为四大类:单列索引(普通索引、唯一索引、主键索引)、组合索引、全文索引、空间索引
单列索引:一个索引只包含单个列,不过一个表中可以有多个单列索引,每个单列索引只包含一列。
普通索引(INDEX):MySQL中的基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据。
唯一索引(UNIQUE INDEX uniqIdx):索引列中的值必须是唯一的,但允许是空值。
主键索引(PRIMARY KEY):一种特殊的唯一单列索引,不允许有空值
组合索引(INDEX MultiIdx):在表中的多个字段组上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合。
全文索引(FULLTEXT INDEX FullTxtIdx):类似于正则表达式,就是通过某个关键字就能找到该关键字所在的记录行。只能在MyISAM存储引擎上才能使用,只能在CHAR、VARCHAR、TEXT类型字段上使用全文索引。
空间索引(SPATIAL INDEX spatIdx):对空间数据类型的字段建立的索引,MySQL中的空间数据类型有四种:GEOMETRY、POINT、LINESTRING、POLYGON。建立空间索引时,使用SPATIAL关键字。
实例表
CREATE TABLE 'award' (
'id' int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
'aty_id' varchar(100) NOT NULL DEFAULT '' COMMENT '活动场景id',
'nickname' varchar(12) NOT NULL DEFAULT '' COMMENT '用户昵称',
'is_awarded' tinyint(1) NOT NULL DEFAULT 0 COMMENT '用户是否领奖',
'award_time' int(11) NOT NULL DEFAULT 0 COMMENT '领奖时间',
'account' varchar(12) NOT NULL DEFAULT '' COMMENT '账户',
'password' char(32) NOT NULL DEFAULT '' COMMENT '密码',
'message' varchar(255) NOT NULL DEFAULT COMMNET '获奖信息',
'create_time' int(11) NOT NULL DEFAULT COMMENT '创建时间',
'update_time' int(11) NOT NULL DEFAULT COMMENT '更新时间',
PRIMARY KEY('id')
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=UTF-8 COMMENT='获奖信息表';
在一个表中添加索引的方式:
1)在创建表的同时创建索引
2)也可以向已创建好的表中添加索引
CREATE [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] 索引名称 ON 表名称(创建索引的字段名[length])[ASC|DESC]
ALTER TABLE 表名称 ADD [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [索引名称](表中要建索引的字段名)[ASC|DESC]
创建普通索引
普通索引时最基本索引。
如果是 char, varchar 类型,length 可以小于字段的实际长度,如果是 BLOB, TEXT 类型必须指定长度。
CREATE INDEX 索引名称 ON 表名称(列名称(length));
ALTER TABLE 表名称 ADD INDEX 索引名称(列名称(length));
CREATE INDEX account_index ON 'award'('account');
ALTER TABLE award ADD INDEX account_Index('account');
创建唯一索引
与普通索引类似,但是不同的是唯一索引要求所有列的值是唯一的,不能重复,这一点和主键索引一样,但是唯一索引允许有空格。
CREATE UNIQUE INDEX 索引名称 ON 表名称(列名称(length));
ALTER TABLE 表名称 ADD UNIQUEQ(列名称);
CREATE UNIQUE INDEX account_unique_index ON 'award'('account');
创建主键索引
主键索引要求列的值是唯一的,不能重复,且不允许有空格。
在BTREE的InnoDB引擎中,主键索引起到了至关重要的地位。
主键索引建立的规则是 int 优于 varchar,一般在建表的时候创建,一般会设为 int 而且是 AUTO_INCREMENT自增类型。最好是与表的其他字段不相关的列或者是业务不相关的列
创建组合索引
一个表中含有多个单列索引不代表是组合索引,通俗一点讲,组合索引是包含多个字段但是只有一个索引名称。
CREATE INDEX 索引名称 ON 表名称(列名称(length), 列名称(length), ...);
CREATE INDEX nickname_account_createTime_index ON 'award'('nickname', 'account', 'created_time');
如果创建了组合索引 (nickname_account_createTime_index) 那么实际包含3个索引 (nickname), (nickname, account), (nickname, account, created_time)
在使用组合索引查询的时候,MySQL遵循最左前缀原则,即索引 where 时的条件要按照建立索引时的字段的排序方式。
1. 不按照索引最左列开始查询(多列索引),不能使用索引
2. 查询某个列有范围查询,则其右边的所有列都无法使用查询(多列查询)
3. 不能跳过某个字段来进行查询,这样利用不到索引
创建全文索引
文本字段(TEXT)上如果建立的是普通索引,那么只有对文本的字段内容前面的字符进行索引,其字符大小根据索引建立时的大小来规定。
如果文本中出现多个一样的字符,而且需要查找的话,那么其条件只能是 where culumn like '%XXXXX%' 但是这样会让索引失效。这种情况下就需要使用全文索引。
ALTER TABLE 表名称 ADD FULLTEXT(列1, 列2);
有了全文索引,就可以使用 select 查询命令去检索那些包含着一个或多个给定单词的数据记录了
SELECT * FROM 表名称 WHERE MATCH(列1, 列2) AGAINST('xxx', 'sss', 'ddd');
-- 该条语句将把列1和列2中含有 xxx, sss, ddd 的数据记录全部查询出来。
查询表中的索引:
SHOW INDEX FROM 表名称\G; # \G只是为了让输出的格式更好看
删除表的索引的两种方式:
ALTER TABLE 表名称 DROP INDEX 索引名称; # 方式一
DROP INDEX 索引名 ON 表名称; # 方式二
索引的优点:
1)大大加快了数据的查询速度,提高性能。
2)所有的MySQL字段类型都可以被索引,也就是可以给任意字段设置索引。
索引的缺点:
1)创建索引和维护索引要消耗时间,并且随着数据量的增加所消耗的时间也会增加。
2)索引也会占空间,我们知道数据表中的数据也会有最大上限设置的,如果我们有大量的索引, 索引文件可能会比数据文件更快到达上限值。
3)当表中的数据进行增加、删除、修改时,索引也需要动态的维护,降低了数据的维护速度。
索引的使用原则:
通过上面的优缺点,我们可以知道,并不是每个字段设置索引就好,更不是索引越多越好,而是根据需要合理使用
1)数据量少的表没必要使用索引,因为数据少,可能查询全部数据所花费的时间比遍历索引的时间还要短,索引就可能不会产生优化效果。
2)经常更新的表避免对其进行过多的索引,只需对经常用于查询的字段创建索引
3)如果一个字段的值会有很多重复(比如性别)最好不要建立索引
MySQL 索引 INDEX的更多相关文章
- MySQL索引的Index method中btree和hash的优缺点
MySQL索引的Index method中btree和hash的区别 在MySQL中,大多数索引(如 PRIMARY KEY,UNIQUE,INDEX和FULLTEXT)都是在BTREE中存储,但使用 ...
- mysql force index() 强制索引的使用
mysql force index() 强制索引的使用 之前跑了一个SQL,由于其中一个表的数据量比较大,而在条件中有破坏索引或使用了很多其他索引,就会使得sql跑的非常慢... 那我们怎么解决呢? ...
- MySQL force Index 强制索引概述
以下的文章主要介绍的是MySQL force Index 强制索引,以及其他的强制操作,其优先操作的具体操作步骤如下:我们以MySQL中常用的hint来进行详细的解析,如果你是经常使用Oracle的 ...
- Mysql数据库学习笔记之数据库索引(index)
什么是索引: SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间. 聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物 ...
- MySQL索引与Index Condition Pushdown
实际上,这个页面所讲述的是在MariaDB 5.3.3(MySQL是在5.6)开始引入的一种叫做Index Condition Pushdown(以下简称ICP)的查询优化方式.由于本身不是一个层面的 ...
- MySQL索引与Index Condition Pushdown(employees示例)
实验 先从一个简单的实验开始直观认识ICP的作用. 安装数据库 首先需要安装一个支持ICP的MariaDB或MySQL数据库.我使用的是MariaDB 5.5.34,如果是使用MySQL则需要5.6版 ...
- Mysql索引详解及优化(key和index区别)
MySQL索引的概念 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库 ...
- MySQL索引与Index Condition Pushdown(二)
实验 先从一个简单的实验开始直观认识ICP的作用. 安装数据库 首先需要安装一个支持ICP的MariaDB或MySQL数据库.我使用的是MariaDB 5.5.34,如果是使用MySQL则需要5.6版 ...
- MySQL InnoDB 索引 (INDEX) 页结构
MySQL InnoDB 索引 (INDEX) 页结构 InnoDB 为了不同的目的而设计了不同类型的页,我们把用于存放记录的页叫做索引页 索引页内容 索引页分为以下部分: File Header:表 ...
随机推荐
- Java的二分查找
今天学习了二分查找,虽然代码简单,但还是要有必要,记录一下今天的学习的. public class TestBrinarySeach { public static void main(String[ ...
- linux shell 学习笔记01
1.命令历史记录history !$ :调用上一条命令的执行结果 !100 :运行history记录里的第100条命令 !ser :调用以ser开头的最后一次执行的命令 ctrl+r ...
- Jmeter(三十九)获取响应结果中参数出现的次数(转载)
转载自 http://www.cnblogs.com/yangxia-test 在测试中,有时候会遇到要统计响应结果中某个参数出现了多少次,如果量级很大,一个一个数不太现实,下面讲一下实现自动打印出该 ...
- Python基础之字典操作
字典 字典的优点: dict key 必须是不可变数据类型,可哈希, value:任意数据类型. dict 优点:二分查找去查询 存储大量的关系型数据 特点:无序的(指的是不可人为的去改变顺序) 数据 ...
- python 自动补全
一.查看python 环境变量 >>> import sys>>> sys.path 编写 tab.py import sys import atexit impo ...
- (转)FFMPEG filter使用实例(实现视频缩放,裁剪,水印等)
本文转载自http://blog.csdn.net/li_wen01/article/details/62442162 FFMPEG官网给出了FFMPEG 滤镜使用的实例,它是将视频中的像素点替换成字 ...
- avcodec_decode_video2少帧问题
使用libav转码视频时发现一个问题:使用下面这段代码解码视频时,解码中会不时丢掉几帧. ){ ret = avcodec_decode_video2(video_dec_ctx, vframe, & ...
- 二叉树的深度优先遍历与广度优先遍历 [ C++ 实现 ]
深度优先搜索算法(Depth First Search),是搜索算法的一种.是沿着树的深度遍历树的节点,尽可能深的搜索树的分支. 当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点 ...
- 通达OA 自定义菜单
1.首先在系统管理----菜单设置中添加菜单主分类,菜单的图片默认是在D:\MYOA\webroot\images中.2.然后再编辑该菜单的下一级,增加子菜单项,子菜单的路径就是您要设置的网址.3.最 ...
- Mac上反编译Android apk安装包
什么是反编译 我们知道,Android的程序打包后会生成一个APK文件,这个文件可以直接安装到任何Android手机上,因此,反编译就是对这个APK进行反编译.Android的反编译分成两个部分: 一 ...