Mysql—索引原理与详解
索引的原理
索引的优点和缺点和使用原则
索引优点:
- 可以加快数据的检索速度,提高查询速度。
- 所有的MySql列类型(字段类型)都可以被索引,也就是可以给任意字段建立索引。
- 全文检索字段进行搜索优化。
索引缺点:
- 创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加。
- 当对表中的数据进行增加、删除、修改的时候,索引也需要动态维护,降低了数据的维护速度。
- 索引也需要占用物理存储空间(数据库目录:/var/lib/mysql)。
- 我们知道数据表中的数据也会有最大上线设置的,如果有大量的索引,索引文件可能会比数据文件更快达到上线值。
使用原则:
- 索引不是越多越好,并不是每个字段都设置索引就好,而是需要自己合理的使用。
- 对经常更新的表就避免对其进行过多的索引,对经常用于查询的字段应该创建索引,不要对经常变动的数据加索引。
- 数据量小的表最好不要使用索引,因为数据较少,可能查询全部数据花费的时间比遍历索引的时间还要短,索引就可能不会产生优化效果。
- 在一同值少的列上(字段上)不要建立索引,比如在学生表的"性别"字段上只有男,女两个不同值。相反的,在一个字段上不同值较多可以建立索引。
什么时候添加索引:
- 在 where、order by 子句中经常使用的字段。
- 字段的值是多个(例如性别字段则不适合)。
- 字段内容不是经常变化的,经常变化的字段,添加索引反而降低性能。
- 不宜过多添加索引,每添加一条索引都会占用磁盘空间。
索引的分类
- 普通索引:加速查找
- 唯一索引:加速查找+约束 (唯一)
- 主键索引:加速查找+约束(不为空且唯一)
- 外键索引:
- 组合索引:primary key(id,name):联合主键索引,unique(id,name):联合唯一索引,index(id,name):联合普通索引
- 全文索引:用于搜索很长一篇文章的时候,效果最好。(full text)
- 空间索引:了解就好,几乎不用。(spatial)
普通索引(index)
使用规则
1.一个表中可以有多个index字段
2.字段的值可以有重复,也可以为null值。字段值无约束
3.经常把做查询条件的字段设置为index字段
4.index字段的key标志为:mul
创建普通索引(有三种方法)
方法1:创建表时创建索引index
create table student(
id int,
name varchar(25),
score float(5,2),
index(name), # 创建name索引
index(score) # 创建score索引
);
方法2:创建表后创建索引index:索引名一般和字段名一样,只要自己能认出就行,可以随便起名。
mysql> create index 索引名 on 表名(字段名)
mysql> create index name on student(name);
方法3:创建表后创建索引index
mysql> alter table 表名 add index 索引名(字段名);
mysql> alter table student add index(name);
mysql> alter table student add index name6(name);
查看普通索引:key一列就是索引的列,我们会发现在name和score有值MUL。
mysql> desc 表名;
mysql> desc student; # Key标志为:MUL
mysql> show index from 表名; # Key_name值为索引名
mysql> show index from student\G; # 如果字段名过多,就添加一个\G。
删除普通索引:删除普通索引只能一个一个删除
mysql> drop index 索引名 on 表名;
mysql> drop index name6 on student;
唯一索引(unique)
使用规则
1.一个表中可以有多个unique字段
2.unique字段的值不允许重复,可以为空值null
3.unique的key标志是UNI
创建唯一索引(基本等同index创建)
方法1:创建表时创建索引
create table student(
id int,
name varchar(25),
score float(5,2),
unique(name),
unique(score)
);
方法2:创建表后创建索引:索引名一般和字段名一样,只要自己能认出就行,可以随便起名。
mysql> create unique index 索引名 on 表名(字段名);
方法3:创建表后创建索引
mysql> alter table student add unique(name);
mysql> alter table student add unique name6(name);
mysql> alter table student add unique index(name);
mysql> alter table student add unique index name6(name);
查看唯一索引
mysql> desc 表名;
mysql> show index from 表名;
删除唯一索引
mysql> drop index 索引名 on 表名;
主键索引(primary key)
外键索引(foreign key)
全文索引(fulltext)
使用须知
1.在MySQL5.6以下,只有MyISAM引擎表支持全文检索。在MySQL5.6以上Innodb引擎表也提供支持全文检索。
2.在MySQL5.6以下,目前只支持英文字符的全文搜索,不支持中文全文索引,原因很简单:与英文不同,中文的文字是连着一起写的,中间没有MySQL能找到分词的地方。
3.相应字段建立FULLTEXT索引,只能在CHAR、VARCHAR、TEXT类型字段上使用全文索引。
4.预设搜寻是不分大小写,若要分大小写,columne 的 character set要从utf8改成utf8_bin。
5.MATCH(title, content)里的字段必须和FULLTEXT(title, content)里的字段一模一样。
6.全文索引,就是在一堆文字中,通过其中的某个关键字等,就能找到该字段所属的记录行。
创建全文索引
方法1:创建表时创建全文索引
create table article (
id int auto_increment not null primary key,
title varchar(200),
body text,
fulltext(title, body)
) engine=myisam;
方法2:创建表后创建全文索引
mysql> alter table 表名称 add fulltext index 索引名称 (字段名1,字段名2)
mysql> alter table article add fulltext index(body);
mysql> alter table article add fulltext index(title, body);
方法3:创建表后创建全文索引
mysql> create fulltext index 索引名称 on 表名称(字段名1,字段名2)
使用全文索引
mysql> select * from 表名称 WHERE MATCH(字段名) AGAINST('条件字符串1*')
mysql> select * from 表名称 WHERE MATCH(字段名) AGAINST('条件字符串1' IN BOOLEAN MODE)
mysql> select * from article where match(title) against('中华日报') ;
mysql> select * from article where match(title,body) against('杜月笙');
删除全文索引
mysql> drop index 索引名称 on 表名称;
重建索引:在数据库运行了较长时间后,索引都有损坏的可能
mysql> repair table 表名称 quick;
全文索引变量值查询
mysql> show variables like 'ft%';
Mysql—索引原理与详解的更多相关文章
- Mysql—事务原理与详解
事务的四大特性 事务的隔离级别 https://www.cnblogs.com/57rongjielong/p/8036418.html https://blog.csdn.net/zwq123211 ...
- MySQL单列索引和组合索引(联合索引)的区别详解
发现index merge局限性,优化器会自动判断是否使用 index merge 优化技术,查询还是需要组合索引[推荐阅读:对mysql使用索引的误解] MySQL单列索引和组合索引(联合索引)的区 ...
- MySQL索引原理及慢查询优化
原文:http://tech.meituan.com/mysql-index.html 一个慢查询引发的思考 select count(*) from task where status=2 and ...
- (转)MySQL索引原理及慢查询优化
转自美团技术博客,原文地址:http://tech.meituan.com/mysql-index.html 建索引的一些原则: 1.最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到 ...
- MySQL索引原理及慢查询优化 转载
原文地址: http://tech.meituan.com/mysql-index.html MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能 ...
- MySQL索引原理及慢查询优化(转)
add by zhj:这是美团点评技术团队的一篇文章,讲的挺不错的. 原文:http://tech.meituan.com/mysql-index.html MySQL凭借着出色的性能.低廉的成本.丰 ...
- 【转载】MySQL索引原理及慢查询优化
原文链接:美团点评技术团队:http://tech.meituan.com/mysql-index.html MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型 ...
- MySQL索引原理与慢查询优化
索引目的 索引的目的在于提高查询效率,可以类比字典,如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql.如果没有索引,那么你可能需要把所有单词看一遍才 ...
- 干货:MySQL 索引原理及慢查询优化
MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能出色,但所谓"好马配好鞍",如何能够更好的使用它,已经成为开发工程师的必修 ...
随机推荐
- easyui-datagrid 使用笔记
1.清空所有行和所有列 $('#dgJGQuery').datagrid({ columns: [], url: '', data: [] }); 2.采用 datagrid-groupview 分组 ...
- Linux下使用 github+hexo 搭建个人博客04-next主题优化
上篇我们说了 hexo 的优化,针对的站点的优化. 本篇讲解 next 主题的优化,包括:使用语言.前端页面显示宽度.菜单.侧栏.头像.添加或取消动画效果.打赏功能等等. 让页面排版更符合我们所要的功 ...
- 编译原理之不懂就问-First集
老师PPT: 这条语言实在是..通俗易懂
- 工作日志,go get -v -x github.com/pebbe/zmq4 失败问题
工作日志,go get -v -x github.com/pebbe/zmq4 失败问题 笔者因为工作需要使用ZeroMQ,但是在执行go get -v -x github.com/pebbe/zmq ...
- Octave中的常用操作2
>> ones(2:3)ans = 1 1 1 1 1 1 >> 2*ones(2:3)ans = 2 2 2 2 2 2 >> rand(3,3) 产生0~1中的 ...
- CSS3的nth-child() 选择器
CSS3的nth-child() 选择器,表格奇偶行变色 nth-child() 应用背景 CSS3的nth-child() 选择器,我之前很少用,在做表格偶数行变色的时候,我通常在绑定的时候,做一个 ...
- QT debug执行exe文件 应用程序无法正常启动0xc000007b
遇到这种错,发现并不是因为缺失dll文件,因为我把需要的DLL都放到Debug文件下了,但还是有这问题: 解决方法: 右键点击-- >我的电脑--属性-->高级系统设置-->环境变量 ...
- LG5239 回望京都 组合数+暴力
问题描述 LG5239 题解 我就是个傻逼,鉴定完毕. 连 \(C_m^n=C_{m-1}^n+C_{m-1}^{n-1}\) 都忘了. 所以暴力求出 \(1000\) 以内的 \(C_i^j\) , ...
- LOJ6033「雅礼集训 2017 Day2」棋盘游戏 (博弈论,二分图,匈牙利算法)
什么神仙思路啊-- 看到棋盘就去想二分图.(smg啊)(其实是校内模拟赛有基本一样的题,只不过直接给了个二分图) 看到二分图就去想最大匹配.(我怎么想偶环的性质去了) (以下内容摘自这里) 这个二分图 ...
- Rails + Webpacker + Puma + Nginx 部署
准备 ssh 登录 首先 ssh 登录服务器,免密码登录可以参考 ssh 免密码登录服务器 创建部署用户 $ sudo adduser deploy 安装依赖 Ruby 这里使用 RVM 安装和管理 ...