MySQL高级知识(三)——索引
前言:索引在sql调优部分占据着重要的位置,了解并深入索引对我们来说也是非常重要的。本篇主要介绍MySQL中索引的相关知识点。
1.索引是什么
MySQL官方对索引的定义:索引(Index)是帮助MySQL高效获取数据的数据结构。因此索引的本质就是数据结构。索引的目的在于提高查询效率,可类比字典、书籍的目录等这种形式。
可简单理解为“排好序的快速查找数据结构”。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。
平常所说的索引,如果没有特别指明,都是B树索引。其中聚集索引、次要索引、覆盖索引、前缀索引、唯一索引默认都是用B树。
通过show index from tablename可以查看表的索引情况。

2.索引的优缺点
优点
①类似大学图书馆的书目索引,提高数据的检索效率,降低数据库的IO成本。
②通过索引列对数据进行排序,降低数据的排序成本,从而降低CPU的消耗。
缺点
①索引实际上也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也要占用空间。
②虽然索引大大提高了查询效率,但是降低了更新表的速度,如insert、update和delete操作。因为更新表时,MySQL不仅要保存数据,还要保存索引文件每次更新的索引列字段,并且在更新操作后,会更新相应字段索引的信息。
③索引只是提高查询效率的一个因素,如果你的MySQL有大量的数据表,就需要花时间研究建立最优秀的索引或优化查询语句。
3.索引分类
索引主要分为以下三类:
①单值索引:一个索引只包含单个列,一个表可以有多个单值索引。
②唯一索引:索引列的值必须唯一,但允许有空值,主键就是唯一索引。
③复合索引:一个索引包含多个列
索引的结构:
①BTREE索引;②Hash索引;③Full-Text索引;④R-Tree索引。
4.基本语法
①创建索引
create [unique] index indexname on tablename(columnname(length)); alter table tablename add index indexname (columnname(length));
注:如果是char、varchar类型的字段,length可以小于字段实际长度;如果是blob、text类型,必须指定length。
②删除索引
drop index indexname on tablename;
③查看索引
show index from tablename;
④其他创建索引的方式
1.添加主键索引
ALTER TABLE `table_name` ADD PRIMARY KEY (`column`) 2.添加唯一索引
ALTER TABLE `table_name` ADD UNIQUE (`column`) 3.添加全文索引
ALTER TABLE `table_name` ADD FULLTEXT (`column`) 4.添加普通索引
ALTER TABLE `table_name` ADD INDEX index_name (`column` ) 5.添加组合索引
ALTER TABLE `table_name` ADD INDEX index_name (`column1`, `column2`, `column3`)
5.建立索引与否的具体情况
①需建立索引的情况
#1.主键自动建立唯一索引。
#2.频繁作为查询条件的字段。
#3.查询中与其他表关联的字段,外键关系建立索引。
#4.高并发下趋向创建组合索引。
#5.查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度。
#6.查询中统计或分组字段。
②不需要创建索引的情况
#1.表记录太少。(数据量太少MySQL自己就可以搞定了)
#2.经常增删改的表。
#3.数据重复且平均分配的字段,如国籍、性别,不适合创建索引。
#4.频繁更新的字段不适合建立索引。
#5.Where条件里用不到的字段不创建索引。
by Shawn Chen,2018.6.21日,下午。
相关内容
MySQL高级知识(三)——索引的更多相关文章
- MySQL高级知识(五)——索引分析
前言:前面已经学习了explain(执行计划)的相关知识,这里利用explain对索引进行优化分析. 0.准备 首先创建三张表:tb_emp(职工表).tb_dept(部门表)和tb_desc(描述表 ...
- MySQL高级知识(七)——索引面试题分析
前言:该篇随笔通过一些案例,对索引相关的面试题进行分析. 0.准备 #1.创建test表(测试表). drop table if exists test; create table test( id ...
- MySQL高级知识(六)——索引优化
前言:索引优化的目的主要是让索引不失效,本篇通过相关案例对索引优化进行讲解. 0.准备 创建经典的tb_emp表. DROP TABLE IF EXISTS `tb_emp`; CREATE TABL ...
- MySQL高级知识系列目录
MySQL高级知识(一)——基础 MySQL高级知识(二)——Join查询 MySQL高级知识(三)——索引 MySQL高级知识(四)——Explain MySQL高级知识(五)——索引分析 MySQ ...
- MySQL高级知识(十五)——主从复制
前言:本章主要讲解MySQL主从复制的操作步骤.由于环境限制,主机使用Windows环境,从机使用用Linux环境.另外MySQL的版本最好一致,笔者采用的MySQL5.7.22版本,具体安装过程请查 ...
- MySQL高级知识(十四)——行锁
前言:前面学习了表锁的相关知识,本篇主要介绍行锁的相关知识.行锁偏向InnoDB存储引擎,开销大,加锁慢,会出现死锁,锁定粒度小,发生锁冲突的概率低,但并发度高. 0.准备 #1.创建相关测试表tb_ ...
- MySQL高级知识(八)——ORDER BY优化
前言:在使用order by时,经常出现Using filesort,因此对于此类sql语句需尽力优化,使其尽量使用Using index. 0.准备 #1.创建test表. drop table i ...
- MySQL高级知识(四)——Explain
前言:explain(执行计划),使用explain关键字可以模拟优化器执行sql查询语句,从而知道MySQL是如何处理sql语句.explain主要用于分析查询语句或表结构的性能瓶颈. 注:本系列随 ...
- MySQL高级知识(一)——基础
前言:MySQL高级知识主要来自尚硅谷中MySQL的视频资源.对于网上视频资源来说,尚硅谷是一个非常好的选择.通过对相应部分的学习,笔者可以说收益颇丰,非常感谢尚硅谷. 1.关于MySQL的一些文件 ...
随机推荐
- SVN 安装后右键出现点击鼠标右键弹出错误提示:CrashHandler initialization error
SVN 安装后右键出现点击鼠标右键弹出错误提示:CrashHandler initialization error 原因是目标文件夹中缺少SendRpt.exe文件 解决方案:找svn是好的的同事将b ...
- dll 已注册 检索 COM 类工厂中 CLSID 为 {XXXX-XXXX-XXX-XXXXX-XXX} 的组件时失败,原因是出现以下错误: 80040154。
前几天碰到的问题,错误提示“ 检索 COM 类工厂中 CLSID 为 {XXXX-XXXX-XXX-XXXXX-XXX} 的组件时失败,原因是出现以下错误: 80040154.”,然而dll已注册,注 ...
- c# 后台分页 jqgrid
/// <summary> /// 获取设备数量 /// </summary> /// <param name="Organid">单位ID&l ...
- mysql数据表的基本操作
好久没梳理下Mysql基础命令了.今天抽空整理了下,虽然很简单...但是还是有必要巩固下基础滴啦 1.创建表:之前需要use database database_name 然后create table ...
- struts2_struts2线程安全吗?
线程安全:在一个进程中有多个线程并发执行,线程执行过程中,变量值是相同的,执行结果也是相同的 struts2线程安全 1.每次请求都会重新创建新的action对象,所以线程安全. 2.由于action ...
- Netty实战十二之WebSocket
如果你有跟进Web技术的最新进展,你很可能就遇到过“实时Web”这个短语,这里并不是指所谓的硬实时服务质量(QoS),硬实时服务质量是保证计算结果将在指定的时间间隔内被递交.仅HTTP的请求/响应模式 ...
- SpringBoot的打包失败
打包是根据pom.xml文件来打的包. 如果使用Maven的默认打包,只会将src/main下的java和resources里面的内容打进Jar包中. 通过maven-assembly-plugin这 ...
- webpack4 系列教程(十一):字体文件处理
教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步<webpack4 系列教程(十一):字体文件处理>原文地址.或者来我的小站看更多内容:godbmw.com 0. 课程介 ...
- Android Lifecycle使用
引言 Lifecycle 是官方提供的架构组件之一,目前已经是稳定版本,Lifecycle 组件包括LifecycleOwner.LifecycleObserver.Lifecycle 组件是执行操作 ...
- react children
children react 中,属性名是一一对应的,除了children. 对于一个组件来说,其this.props.children拿到的是什么呢???举个