iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL数据库高级(六)——索引
  • 777
分享到

MySQL数据库高级(六)——索引

2024-04-02 19:04:59 777人浏览 薄情痞子
摘要

Mysql数据库高级(六)——索引 一、索引简介 1、索引简介 索引(Index)是帮助mysql高效获取数据的数据结构。在Mysql中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的。M

Mysql数据库高级(六)——索引

一、索引简介

1、索引简介

索引(Index)是帮助mysql高效获取数据的数据结构
在Mysql中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的。MyISAM和InnoDB存储引擎只支持BTREE索引,MEMORY/HEAP存储引擎支持HASH和BTREE索引。    

2、索引的优点

A、提高数据检索效率,降低数据库io成本。
B、通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗。
C、大大加快数据的查询速度。

3、索引的缺点

A、创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加
B、索引也需要占空间,我们知道数据表中的数据也会有最大上线设置的,如果我们有大量的索引,索引文件可能会比数据文件更快达到上线值
C、当对表中的数据进行增加、删除、修改时,索引也需要动态的维护,降低了数据的维护速度。

4、索引的使用原则

A、主键自动建立唯一索引
B、频繁作为查询条件的字段应该创建索引
C、查询中与其他表关联的字段,外键关系建立索引
D、频繁更新的字段不适合建立索引,因为每次更新不单单是更新了记录还会更新索引
E、WHERE条件里用不到的字段不创建索引
F、单键/组合索引的选择问题,who?(在高并发下倾向创建组合索引)
G、查询中排序的字段,排序的字段若通过索引去访问将大大提高排序速度
H、查询中统计或者分组字段
不适合使用索引的场合:
A、对经常更新的表就避免对其进行过多的索引,对经常用于查询的字段应该创建索引。
B、数据量小的表最好不要使用索引,由于数据较少,可能查询全部数据花费的时间比遍历索引的时间还要短,索引就可能不会产生优化效果。
C、在不同值少的列上不要建立索引,比如在学生表的"性别"字段上只有男,女两个不同值。在一个不同值较多的列可以建立索引。

二、索引的分类

1、单列索引

单列索引只包含单个列,但一个表中可以有多个单列索引。
A、普通索引
普通索引允许在定义索引的列中插入重复值和空值。
B、唯一索引
索引列中的值必须是唯一的,但是允许为空值。
C、主键索引
主键索引是一种特殊的唯一索引,不允许有空值。

2、复合索引

在表中的多个字段组合上创建的索引,只有在查询条件中使用了组合的多个字段的左边字段时,索引才会被使用,使用复合索引时遵循最左前缀集合

3、全文索引

全文索引,只有MyISAM存储引擎支持,只能在CHAR、VARCHAR、TEXT类型字段上使用全文索引。
全文索引主要用来查找文本中的关键字,而不是直接与索引中的值相比较。在数据量较大时候,先将数据放入一个没有全文索引的表中,然后再用CREATE index创建fulltext索引,要比先为一张表建立fulltext然后再将数据写入的速度快很多。

4、空间索引

空间索引是对空间数据类型的字段建立的索引,MySQL中的空间数据类型有四种:GEOMETRY、POINT、LINESTRING、POLYGoN。
 在创建空间索引时,使用SPATIAL关键字。
 空间索引必须使用MyISAM存储引擎, 并且空间索引的字段必须为非空。

三、索引的操作

1、索引的创建

创建表时创建索引的语法:

CREATE TABLE table_name[col_name data type]
[UNIQUE|FULLTEXT|SPATIAL][INDEX|KEY][index_name](col_name[length])[asc|desc]

在表上创建索引的语法:

ALTER TABLE tablename ADD[UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [indexname] (col_name)[ASC|DESC];
CREATE [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] indexname ON tablename(col_name[length])[ASC|DESC];

unique|fulltext为可选参数,分别表示唯一索引、全文索引
index和key为同义词,两者作用相同,用来指定创建索引
col_name为需要创建索引的字段列,该列必须从数据表中该定义的多个列中选择
index_name指定索引的名称,为可选参数,如果不指定,默认col_name为索引值
length为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度
asc或desc指定升序或降序的索引值存储
在创建索引时如果不指定索引名,默认使用字段名作为索引名。

2、普通索引的创建

直接创建索引
CREATE INDEX index_name ON tablename(column(length))
修改表结构
ALTER TABLE table_name ADD INDEX index_name ON (column(length))
创建表时指定索引

CREATE TABLE tablename
(
col_name1 type,
col_name2 type,
INDEX index_name(col_name)
);

3、唯一索引的创建

索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
直接创建唯一索引
CREATE UNIQUE INDEX indexName ON tablename(column(length))
修改表结构
ALTER TABLE table_name ADD UNIQUE indexName ON (column(length))
创建表时直接指定

CREATE TABLE tablename
(
col_name1 type,
col_name2 type,
UNIQUE INDEX index_name(col_name)
);

4、主键索引的创建

修改表结构
ALTER TABLE table_name ADD PRIMARY KEY(col_name)
创建表时直接指定

CREATE TABLE tablename
(
col_name1 type,
col_name2 type,
PRIMARY KEY(col_name)
);

5、复合索引的创建

直接创建复合索引
CREATE INDEX indexName ON tablename(col_name1,col_name2)
修改表结构
ALTER TABLE table_name ADD INDEX indexName(col_name1,col_name2)
创建表时直接指定

CREATE TABLE tablename
(
col_name1 type,
col_name2 type,
INDEX index_name(col_name1,col_name2)
);

6、全文索引的创建

直接创建全文索引
CREATE FULLTEXT INDEX indexName ON tablename(col_name)
修改表结构
ALTER TABLE table_name ADD FULLTEXT INDEX indexName(col_name)
创建表时直接指定

CREATE TABLE tablename
(
col_name1 type,
col_name2 type,
FULLTEXT INDEX index_name(col_name)
);

在使用全文索引时,需要借助MATCH AGaiNST操作,而不是一般的WHERE语句加LIKE。全文索引的限制比较多,比如只能使用MyISAM存储引擎,比如只能在CHAR、VARCHAR、TEXT上设置全文索引。比如搜索的关键字默认至少要4个字符,比如搜索的关键字太短就会被忽略掉。
SELECT * FROM tablename WHERE MATCH(col_name) AGAINST('pattern');
col_name为全文索引列,'pattern'为匹配的字符串

7、索引的删除

DROP INDEX [indexName] ON tablename; 
ALTER TABLE tablename DROP INDEX indexname;

8、索引信息的查看

SHOW INDEX FROM table_name;

9、索引的注意事项

A、索引不会包含有null值的列
在数据库设计时不要让字段的默认值为null。
B、使用短索引
C、索引列排序
因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
D、like语句操作
一般情况下不推荐使用like操作,如果非使用不可。like “%aaa%”不会使用索引而like “aaa%”可以使用索引。
E、不要在列上进行运算
在索引列上进行运算将导致索引失效而进行全表扫描,例如
SELECT * FROM table_name WHERE YEAR(column_name)<2017;
F、不使用not in和<>操作

四、索引查询速度比较

1、插入记录

create procedure addStudent(in num int)
begin
declare i int;
set i=1;
delete from TStudent;
while num>=i do
insert TStudent values 
(
       LPAD(convert(i,char(10)),10,'0'),
       CreateName(),
       if(ceil(rand()*10)%2=0,'男','女'),
       RPAD(convert(ceil(rand()*1000000000000000000),char(18)),18,'0'),
       Concat(convert(ceil(rand()*10)+1980,char(4)),'-',LPAD(convert(ceil(rand()*12),char(2)),2,'0'),'-',LPAD(convert(ceil(rand()*28),char(2)),2,'0')),
       Concat(PINYIN(sname),'@hotmail.com'),
       case ceil(rand()*3) when 1 then '网络与网站开发' when 2 then 'JAVA' ELSE 'NET' END,
       NOW()
);
set i=i+1;
end while;
select * from TStudent;
end

修改addStudent存储过程,插入500000条记录
call addStudent(500000);
SQL语句查询×××号cardID以12345开头的学生。
select * from TStudent where cardID like '12345%'
MySQL数据库高级(六)——索引
花费时间为1.27秒

2、给×××列添加索引

alter table TStudent add index cardidIndex(cardID);
SQL语句查询×××号cardID以12345开头的学生。
select * from TStudent where cardID like '12345%'
花费时间31毫秒。

3、查看索引占用的磁盘空间

schoolDB数据库索引占用的磁盘空间。

SELECT CONCAT(ROUND(SUM(index_length)/(1024*1024), 2), ' MB') 
AS 'Total Index Size' FROM infORMation_schema.TABLES
WHERE table_schema LIKE 'schoolDB'; 

查看schoolDB数据库数据占用的磁盘空间。

SELECT CONCAT(ROUND(SUM(data_length)/(1024*1024), 2), ' MB') 
AS 'Total Data Size' 
FROM information_schema.TABLES WHERE table_schema LIKE 'schoolDB';

4、查看QL语句执行计划

EXPLAIN可以查看SQL查询语句的查询计划,使用索引还是全表扫描,key显示使用的索引。
explain select * from TStudent where cardid like '12345%' \G;
MySQL数据库高级(六)——索引
id: SELECT识别符,即SELECT的查询序列号,一条语句中,select是第几次出现。
select_type:所使用的SELECT查询类型,SIMPLE表示为简单的SELECT,不实用UNION或子查询。其他取值,PRIMARY:最外面的SELECT在拥有子查询时,就会出现两个以上的SELECT。UNION:union(两张表连接)中的第二个或后面的select语句  SUBQUERY:在子查询中,第二SELECT。
table:数据表的名字。按被读取的先后顺序排列。
type:指定本数据表和其他数据表之间的关联关系,表中所有符合检索值的记录都会被取出来和从上一个表中取出来的记录作联合。ref用于连接程序使用键的最左前缀或者键不是primary key或unique索引的情况。取值有system、const、eq_ref、index和All。
possible_keys:MySQL在搜索数据记录时可以选用的各个索引
key:实际选用的索引
key_len:显示MySQL使用索引的长度(使用的索引个数),当key字段的值为 null时,索引的长度就是null。
ref:给出关联关系中另一个数据表中数据列的名字。
rows:MySQL在执行查询时预计会从数据表里读出的数据行的个数。
extra:提供与关联操作有关的信息。   

五、覆盖索引

1、覆盖索引

一个包含查询所需的字段的索引称为覆盖索引(covering index)。MySQL只需要通过索引就可以返回查询所需要的数据,而不必在查到索引之后进行回表操作,减少IO,提供效率。
通过EXPLAIN查看SQL语句的执行计划时,在EXPLAIN的Extra列出现Using Index提示时,说明SQL查询使用覆盖索引。

2、使用覆盖索引的SQL语句

Tstudent表cardID列创建了索引,SQL语句查找的列是cardID,查找条件也是cardID,就会使用cardID索引进行查找,不需要扫描表的页。
explain select sname from TStudent where sname like '刘%';
执行结果Extra 出现using index,说明是使用覆盖索引查找。

3、使用覆盖索引实现order by排序

在MySQL中的ORDER BY有两种排序实现方式:
A、利用有序索引获取有序数据
B、文件排序
使用EXPLAIN分析SQL查询时,利用有序索引获取有序数据显示Using index。而文件排序显示Using filesort。
explain select email from TStudent order by email;
email列没有索引,SQL语句的查询计划可以看到Extra是using filesort,说明是将结果在内存中排序,需要额外时间开销。
给Email列添加索引后,

alter table TStudent add index emailIndex(email);
explain select email from TStudent order by email;

再次执行,可以看到Extra列是Using index,说明使用索引排序,没有额外时间开销。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL数据库高级(六)——索引

本文链接: https://www.lsjlt.com/news/40023.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL数据库高级(六)——索引
    MySQL数据库高级(六)——索引 一、索引简介 1、索引简介 索引(Index)是帮助MySQL高效获取数据的数据结构。在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的。M...
    99+
    2022-10-18
  • 《MySQL高级篇》六、索引的创建与设计原则
    文章目录 1. 索引的声明与使用1.1 索引的分类1.2 创建索引1、创建表的时候创建索引2、在已经存在的表上创建索引 1.3 删除索引 2. MySQL 8.0 索引新特性2.1 ...
    99+
    2023-09-01
    MySQL
  • Mysql数据库百万级数据测试索引效果
    目录Mysql数据库百万数据测试索引一、索引的分类二、使用索引三、百万数据测试索引效果1. 再来创建个测试表2. 插入数据3. 测试查询四、索引使用原则Mysql数据库百万数据测试索...
    99+
    2022-11-13
  • mysql数据库的索引
    day04  MySQL数据库的索引一、索引概述:    索引是由一张表中的某个列或多列组成,而创建索引的目的是为了更优化管理我们的数据库表,提升我们查询使...
    99+
    2022-10-18
  • MySQL数据库引擎和索引
    一、MySQL 数据库引擎:1. Innodb引擎:Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别。在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的...
    99+
    2022-10-18
  • MySQL数据库(六)
    ##################################### MySQL数据库主从同步 主从同步: 让其他数据库服务器自动同步正在提供服务的数据库服务器上的数据。 构建主从同步 (a)确保主...
    99+
    2022-10-18
  • MySQL高级篇之索引的数据结构详解
    目录1.为什么使用索引?2.索引的优缺点3.InnoDB中的索引3.1 设计索引3.2 常见索引概念3.2.1 聚簇索引3.2.2 非聚簇索引3.2.3 联合索引4.InnoDB与M...
    99+
    2022-11-13
  • MySQL高级篇——索引简介
    🙌作者简介:数学与计算机科学学院学生、分享学习经验、生活、 努力成为像代码一样有逻辑的人 🌙个人主页:阿芒的主页 文章目录 👩‍🔧索引是什么👩‍&...
    99+
    2023-08-16
    mysql 数据库 java
  • mysql数据库索引用处
    本文主要给大家介绍mysql数据库索引用处,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下mysql数据库索引用处吧。    &n...
    99+
    2022-10-18
  • MySQL数据库唯一索引
    引言:什么是索引 创建索引是指在某个表的一列或多列上建立一个索引,以便提高对表的访问速度。创建索引有3种方式,分别是1.创建表的时候创建索引、2.在已经存在的表上创建索引和使用3.ALTER TABLE语句来创建索引。 本文福利,莬费领...
    99+
    2023-09-06
    数据库 mysql sql qt教程 qt开发
  • MYSQL(一)数据库索引类型,索引优点
    索引在mysql中也叫做键(key),是存储引擎用于快速找到记录的一种数据结构。索引结构类型(常见有两种):1. B-Tree索引大多数mysql引擎都支持这种索引;  &nb...
    99+
    2022-10-18
  • mysql加索引,数据库卡死
    公司的一个内部项目,由于突然导入了几十万的数据,数据量翻了一倍,导致了某个页面打开很慢。通过sql日志看到主要是由于慢查询引起的,通过explain这个sql,发现主要是由于这个SQL没有命中索引,进行了全表扫描,慢是肯定了的。 为了优化这...
    99+
    2023-09-09
    数据库 mysql java
  • MySQL数据库索引介绍 - Mr
    一、什么是索引 索引是mysql数据库中的一种数据结构,就是一种数据的组织方式,这种数据结构又称为key 表中的一行行数据按照索引规定的结构组织成了一种树型结构,该树叫B+树 二、为何要用索引 优化查询速度 注意:只能加速索引字段 三、如...
    99+
    2016-01-29
    MySQL数据库索引介绍 - Mr
  • mysql数据库的索引类型
    索引类型介绍:主键索引primary key() 要求关键字不能重复,也不能为null,同时增加主键约束 主键索引定义时,不能命名唯一索引unique index() 要求关键字不能重复,同时增加唯一约束普...
    99+
    2022-10-18
  • mysql数据库索引如何做?
    MySQL索引底层的实现,今天简单聊一聊,少讲“是怎么样”,更多说说“为什么设计成这样”。 问题1. 数据库为什么要设计索引? 图书馆存了1000W本图书,要从中找到《架构师之路》,一本本查,要查到什么时候...
    99+
    2022-10-18
  • MySQL数据库的常用索引
    MySQL数据库的常用索引 本文关键字:数据库、MySQL、索引的作用、常用索引在使用数据库的过程中,经常会进行数据的查询。随着数据量的增大,查询的时间会变的原来越长,这就需要合理的建立索引来提高查询效率。 一、索引概述 1. 数据库检索 ...
    99+
    2022-01-24
    MySQL数据库的常用索引 数据库入门 数据库基础教程 数据库 mysql
  • MySQL数据库索引和事务
    目录1. 索引 1.1 概念 1.2 作用 1.3 索引的原理 1.3.1 减少磁盘的访问次数是构建索引的核心思想 1.3.2 B+ 树适用实现索引的底层 1.4 适用场景 1.5 ...
    99+
    2022-11-12
  • MySQL数据库之索引详解
    目录一、MySQL索引简介二、MySQL五种类型索引详解(一)普通索引(二)唯一性索引(三)主键索引(四)复合索引(五)全文索引三、MySQL索引使用原则总结今天继续给大家介绍MyS...
    99+
    2022-11-12
  • mysql数据库的高级应用索引、视图,触发器的详细介绍
    下文主要给大家带来mysql数据库的高级应用索引、视图,触发器的详细介绍,希望这些内容能够带给大家实际用处,这也是我编辑mysql数据库的高级应用索引、视图,触发器的详细介绍这篇文章的主要目的。好了,废话不...
    99+
    2022-10-18
  • 数据库索引
    索引(index)是帮助MySQL高效获取数据的数据结构。常见的查询算法:顺序查找、二分查找、二叉树查找、哈希散列、分块查找、B树。   1)哈希算法:就是把任意长度值(key)通过散列算法变成固定长度的key地址,通过这个地址进行访问的数...
    99+
    2017-04-03
    数据库索引
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作