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条件里用不到的字段不创建索引。

参考网址见:https://www.cnblogs.com/developer_chan/p/9208404.html

原文地址:https://www.cnblogs.com/lipengsheng-javaweb/p/12441933.html

时间: 2024-10-08 10:20:27

MySQL高级知识(三)——索引的相关文章

MySQL 高级知识(索引、优化)

MySQL体系架构 连接池组件.管理服务和工具组件.SQL接口组件.查询分析器组件.优化器组件.缓冲组件.插件式存储引擎.物理文件:1.连接层:主要完成一些类似于连接处理,授权认证及相关的方案:2.服务层:主要完成大多数核心服务功能:3.引擎层:负责MySQL中数据的存储和提取,服务器通过API与存储引擎进行通信:注:储存引擎式基于表的,而不是数据库的: MySQL存储引擎InnoDB 和 MyISAM区别:1.InnoDB支持主外键.事务:2.InnoDB是行锁,操作时候只锁一行数据,适合高并

MySQL高级知识(五)——索引分析

前言:前面已经学习了explain(执行计划)的相关知识,这里利用explain对索引进行优化分析. 0.准备 首先创建三张表:tb_emp(职工表).tb_dept(部门表)和tb_desc(描述表) 1)tb_emp表. DROP TABLE IF EXISTS `tb_emp`; CREATE TABLE `tb_emp` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(20) NOT NULL,PRIMARY KEY

MySQL高级知识(四)——Explain

前言:explain(执行计划),使用explain关键字可以模拟优化器执行sql查询语句,从而知道MySQL是如何处理sql语句.explain主要用于分析查询语句或表结构的性能瓶颈. 注:本系列随笔如无特殊说明都MySQL版本都为5.7.22. 1.explain的作用 通过explain+sql语句可以知道如下内容: ①表的读取顺序.(对应id) ②数据读取操作的操作类型.(对应select_type) ③哪些索引可以使用.(对应possible_keys) ④哪些索引被实际使用.(对应k

MySQL高级知识-查询与索引优化分析

性能下降SQL慢.执行时间长.等待时间长 查询语句写的烂索引失效单值索引复合索引关联查询太多join(设计缺陷或不得已的需求,除非你能干的过你的产品经理)服务器调优及各个参数设置(缓冲.线程数等)常见通用的Join查询 SQL执行顺序 手写 手写SQL顺序 机读(MySQL读取顺序) 机读顺序 总结-SQL解析顺序 SQL解析 七种JOIN图解 实验: 练习 1.A.B两表共有 select * from tbl_emp a inner join tbl_dept b on a.deptId =

MySQL高级知识(七)——索引面试题分析

前言:该篇随笔通过一些案例,对索引相关的面试题进行分析. 0.准备 #1.创建test表(测试表). drop table if exists test; create table test( id int primary key auto_increment, c1 varchar(10), c2 varchar(10), c3 varchar(10), c4 varchar(10), c5 varchar(10) ) ENGINE=INNODB default CHARSET=utf8; i

MySQL高级知识- MySQL的架构介绍

[TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性. Mysql是开源的,所以你不需要支付额外的费用. Mysql支持大型的数据库.可以处理拥有上千万条记录的大型数据库. MySQL使用标准的SQL数据语言形式. Mysql可以允许于多个系统上,并且支持多种语言.这些编程语言包括C.C+

MySQL学习笔记(三)—索引

一.概述 1.基本概念       在大型数据库中,一张表中要容纳几万.几十万,甚至几百万的的数据,而当这些表与其他表连接后,所得到的新的数据数目更是要大大超出原来的表.当用户检索这么大量的数据时,经常会感觉慢.这个时候要提高数据库的检索性能,就必须要用到索引.给表追加合适的索引能极大的改善数据检索的效率,提供数据库性能.      索引是在存储引擎中实现的,因此每种存储引擎的索引都不一定完全相同,而且每种存储引擎也不一定支持所有的索引类型.      所有存储引擎支持每个表至多16个索引,总索

MySQL高级知识 <一> 配置文件以及架构介绍

linux下mysql的一些目录 db是一个文件夹:/var/lib/mysql 字符集文件:/usr/share/mysql 命令目录:/usr/bin 启停脚本:/etc/init.d/mysql 1.MySQL配置文件 配置文件:/etc/my.conf 日志文件,注意:要使用日志需要在my.cnf下设置下列类型和自定义路径,我用的5.7默认是关闭的log-bin:二进制日志 记录主从复制相关操作.log:查询日志 记录查询的sql语句.log-error:记录严重的警告和错误信息, 每次

MySQL高级知识(八)——ORDER BY优化

前言:在使用order by时,经常出现Using filesort,因此对于此类sql语句需尽力优化,使其尽量使用Using index. 0.准备 #1.创建test表. drop table if exists test; create table test( id int primary key auto_increment, c1 varchar(10), c2 varchar(10), c3 varchar(10), c4 varchar(10), c5 varchar(10) )