MySQL数据库索引:索引介绍和使用原则
本篇目录:
一、数据页与索引页
二、聚簇索引与非聚簇索引
三、唯一索引
四、索引的创建
五、索引的使用规则
六、数据库索引失效情况
本篇正文:
一、数据页与索引页
数据库的表存储分为数据页存储和索引页存储,索引页中储存的是指数据页的指针。索引页所占的存储空间比数据页要小很多。
二、聚簇索引与非聚簇索引
索引(Index)的存储方式分为两种:聚簇索引(Clustered Index)和非聚簇索引(Nonclustered Index)。
聚簇索引:它并不是一种单独的索引类型,而是一种数据存储方式,它指定了数据在表中的物理存储顺序。因为单个表在磁盘上只能有一个物理记录排序方式,所以一个表只能有一个聚簇索引。指定索引列后,数据会按照索引列重新一一排序(未指定情况下是按照主键排序的),并将其存储为表的副本。此副本(数据页)和索引页存储需要额外占用的空间大小,至少是该表的120%。此外,在插入新行、更新行的索引列值时,DBMS将自动对数据重新排序,经常大量插入行或更新索引列的值时,尽量不要使用聚簇索引。
非聚簇索引:非聚簇索引的顺序不影响数据的物理存储顺序的。如果说聚簇索引是一本词典的a-z排序方式(物理存储方式),那么非聚簇索引就是词典后面的各种附录索引。不同的附录索引里的关键字排序是不一样的,但是可以根据这个索引快速定位到单词所在的页数(物理位置)。其查询速度没有聚簇索引快,但是在一定程序上可以提高查询效率。一张表最多可以创建249个非聚簇索引,每个非聚簇索引都需要进行索引页的存储。因为它占用很多空间的,所以非聚簇索引并不是越多越好。
三、唯一索引
唯一索引:一种特殊的索引,不允许索引值重复。也就是指定的索引列,不能出现重复的值,有点类似主键。创建该索引时,DBMS会检查是否有重复的索引值,如果有会报错,创建索引失败。索引创建后,会在每次使用 INSERT 或 UPDATE 语句添加数据时进行检查。
四、索引的创建
数据库创建索引需要有唯一的名字,指明索引名和索引列,且索引名不可与表名重复。
以MySQL的创建索引为例
聚簇索引创建语句:
create clustered index [index_name]
on [table_name] ([column1], [column2], ...)
非聚簇索引创建语句:
create index [index_name]
on [table_name] ([column1], [column2], ...)
聚簇唯一索引创建语句:
create clustered unique index [index_name]
on [table_name] ([column1], [column2], ...)
非聚簇唯一索引创建语句:
create unique index [index_name]
on [table_name] ([column1], [column2], ...)
五、索引的使用规则
1、小数据的表不需要创建索引,因为没啥卵用,这并不能提高查询效率。
2、用户查询的字段数据有很多数值或者很多NULL时,创建索引可以提高查询效率。
3、查询返回的数据结果行少于总量的25%,索引可显著提高查询效率;反之,索引的作用就不大了。
4、索引列必须在where中频繁使用,或者是order by用到的列,否则其作用就不大。
5、初始化表数据时,先装入数据,后创建索引。否则,每加一条数据都要更新索引,开销大。
6、索引提高了检索速度,降低了数据的更新速度。对表进行大量写入和更新时,建议先移除索引,再创建索引,可节省时间,提高效率。所以索引不是越多越好。
7、索引会占用数据库空间,设计数据库时需要考虑其大小。
8、表和其索引尽量存储于不同的磁盘上,可提高查询速度。这个涉及到硬盘数据的读取原理。
六、数据库索引失效情况 Last updated on 2018/07/07, to be continued...
1、没有查询条件,或者查询条件没有建立索引(废话)
2、在查询条件上没有引导列(废话)
3、查询条件中,使用函数在索引列上,或者对索引列进行运算(+,-,*,/,!)
错误:select * from user where id/3 > 1000
正确:select * from user where id > 3000
4、like中包含前模糊匹配的会失效
有效:
select * from user where name like '97725300569276449';
select * from user where name like '97725300569276449%';
select * from user where name like '9772530056927%';
select * from user where name like '977253005%';
select * from user where name like '977253%';
查询效率依次降低,所以说查询信息越精确越好
失效:
select * from user where name like '%97725300569276449';
select * from user where name like '%97725300569276449%';
5、查询条件中没有引用组合索引中第一位置的索引列
特别说明:如果创建的索引是user_index(name,city,sex),那么where city = 'YYY' and name = 'XXX'的效率和where name = 'XXX' and city = 'YYY'是一样的,因为MySQL优化器会自动调整查询条件的先后顺序,以匹配最适应的索引进行查询。但是where city = 'YYY' and sex = '1'就不能发挥user_index索引的作用了。
扩展:sex这一列值比较单一,就是0和1,所以它上面建立索引效率提示不大哦~
6、字符型的字段,查询内容为数字时,不加引号
7、in, not in使用要慎重,连续范围查询区间
(1) 可以用between and就不要用in
select num from a where num in(1,2,3,4,5)
改为
select num from a where num between 1 and 5
(2) 有的时候exsits可以用来优化in,比如
select num from a where num in(select num from b)
改为:
select num from a where exists(select 1 from b where num=a.num)
8、表字段为time类型,而查询条件内容为date类型,或者相反情况
9、不建议在where中进行is null和is not null请慎用,MySQL5.6.21上,is null是有效果的,is not null是全表扫描,个人猜测速度和表内null所占比例有关。
10、where查询子句中有!=,<>都会促使引擎放弃索引,使用全表扫描
11、where查询条件中使用or连接条件,会促使引擎放弃索引,使用全表扫描,可以用union all联结查询结果
12、where查询中使用参数,会促使引擎放弃索引,使用全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。
如下面语句将进行全表扫描: select id from t where num=@num
可以改为强制查询使用索引: select id from t with(index(索引名)) where num=@num
MySQL优化索引查询,可参见以下博客:
https://www.cnblogs.com/lonnie/p/8320095.html
MySQL数据库索引:索引介绍和使用原则的更多相关文章
- MySQL数据库之索引
1 引言 在没有索引的情况下,如果要寻找特定行,数据库可能要遍历整个数据库,使用索引后,数据库可以根据索引找出这一行,极大提高查询效率.本文是对MySQL数据库中索引使用的总结. 2 索引简介 索引是 ...
- 千万级MySQL数据库建立索引,提高性能的秘诀
实践中如何优化MySQL 实践中,MySQL的优化主要涉及SQL语句及索引的优化.数据表结构的优化.系统配置的优化和硬件的优化四个方面,如下图所示: SQL语句及索引的优化 SQL语句的优化 SQL语 ...
- Mysql数据库的简单介绍与入门
Mysql数据库的简单介绍与入门 前言 一.下载与安装 1.下载 官网下载MYSQL5.7.21版本,链接地址https://www.mysql.com/downloads/.下载流程图如下: 找到M ...
- Mysql数据库的索引原理
写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询将 ...
- MySQL数据库_索引_事务_优化 _锁_存储引擎_存储过程_CAP
##一.基础 ## * 插入 INSERT INTO table_name ( field1, field2,...fieldN ) ...
- MySQL数据库之索引、事务、存储引擎详细讲解
一.索引 1.1 索引的概念 索引是一个排序的列表,存储着索引值和这个值所对应的物理地址 无须对整个表进行扫描,通过物理地址就可以找到所需数据 (数据库索引类似书中的目录,通过目录就可以快速査找所需信 ...
- MySQL数据库对象-索引
1. 概述2. 索引分类2.1 不同索引的概念2.1.1 普通索引2.1.2 唯一索引2.1.3 全文索引2.1.4 多列索引3. 索引操作3.1 普通索引3.1.1 创建表时创建普通索引3.1.2 ...
- MYSQL数据库学习----索引和触发器
一:索引 索引是创建在数据库表上,其作用是提高对表中数据的查询速度. 假设数据库中有一张1000条记录的表格,如果没有创建索引的话,用户想通过查询条件查询,实际上是把整个数据库中1000条记录都读取一 ...
- mysql数据库的索引
什么是索引 索引就是一种优化查询的数据结构: 为什么要加索引 因为创建索引可以大大提高系统的查询性能. 怎么提高查询性能的 简单的理解:一张数据量比较大的表格如果没有添加任何索引,那我们在执行查询的时 ...
- MySQL数据库中索引的数据结构是什么?(B树和B+树的区别)
B树(又叫平衡多路查找树) 注意B-树就是B树,-只是一个符号. B树的性质(一颗M阶B树的特性如下) 1.定义任意非叶子结点最多只有M个儿子,且M>2: 2.根结点的儿子数为[2, M]: 3 ...
随机推荐
- 01-书城http状态405-此url不支持http方法get
错误: http状态405-此url不支持http方法get 原因:
- 放眼全球,关注游戏质量变化:腾讯WeTest发布《2019中国移动游戏质量白皮书》
2019是中国游戏市场,尤其是手游市场称得上是跌宕起伏的一年,同时也是各大厂商推陈出新突破过去的一年.面对竞争激烈的市场,手游厂商们不仅着眼于游戏质量的提升,更是将一众优秀的国产游戏带入到了海外市场, ...
- VS Code的git配置
最近打算使用VS Code作为python的编辑器,这里记录一下VS Code中git的配置方法 因为vscode中git只是使用本地的git,所以本地必须先安装git才行. 1.git的安装 git ...
- cmake使用的一些补充
一般使用cmake生成vs项目的时候,要么生成32位的要么生成64位的. 怎样将32位和64位在一个工程中打开呢,联系我们自己建立的工程都是32位和64位在一起的,就动手开始了. 实验对象是openc ...
- 文件服务器之fastDFS
FastDFS是一个开源的轻量级分布式文件系统,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别适合中小文件(建议范围:4KB < file ...
- python csv 数据切割定制jmeter数据
需求压测随机抽取10w数据中自定义区间的指定数量数据进行压测: jmeter csv/txt配置: 需要获取{data: [${myList}] } jmeter需要数据类型 获取展读取csv数据 ...
- Linux :ls 命令
常用命令: ls:列出当前路径下的文件和目录 ls -a:列出当前路径下的所有文件和目录(包括隐藏文件和目录) ls -l:以列表方式显示文件或目录的详细信息 ls -al:可以结合使用 ls xxx ...
- python2.7环境下升级pip3,及出错解决办法
执行 pip3 install --upgrade pip 进行升级 升级后若出现, Import Error:cannot import name main 是因为将pip更新为10.0.0后库里面 ...
- 洛谷P1144最短路计数
题目描述 给出一个NNN个顶点MMM条边的无向无权图,顶点编号为1−N1-N1−N.问从顶点111开始,到其他每个点的最短路有几条. 输入格式 第一行包含222个正整数N,MN,MN,M,为图的顶点数 ...
- eclipse 热部署
参考: http://blog.sina.com.cn/s/blog_be8b002e0101koql.html