当前位置: 首页 > 编程日记 > 正文

5 MySQL索引

目录:

  1. 索引概述

    1.1 为什么引入索引

    1.2 什么是索引

    1.3 索引的好处

    1.4 索引的不足

    1.5 索引分类

  2. 索引设计原则

  3. 索引建立和删除

    3.1 索引创建

    3.2 索引删除

  4. 索引实验

1. 索引概述

1.1 为什么引入索引[1]

问题:假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录。如果没有索引,查询将对整个表进行扫描,最坏的情况下,如果所有数据页都不在内存,需要读取10^4个页面,如果这10^4个页面在磁盘上随机分布,需要进行10^4I/O,假设磁盘每次I/O时间为10ms(忽略数据传输时间),则总共需要100s

解决方案:对之建立B-Tree索引,则只需要进行log100(10^6)=3次页面读取,最坏情况下耗时30ms

1.2 什么是索引[2]

索引是根据表中一列或若干列按照一定顺序建立的列值与记录行之间的对应关系表。类似于一本书的目录。

在数据库系统中建立索引主要有以下作用:

(1) 快速取数据;

(2) 保证数据记录的唯一性;

(3) 实现表与表之间的参照完整性;

(4) 在使用order bygroup by子句进行数据检索时,利用索引可以减少排序和分组的时间。

1.3 索引的好处[2]

(1) 大大加快数据的检索速度;

(2) 创建唯一性索引,保证数据库表中每一行数据的唯一性;

(3) 加速表和表之间的连接;

(4) 在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。

1.4 索引的不足[3]

(1) 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
(2) 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
(3) 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速

1.5 索引分类[4]

1.5.1. 普通索引、唯一索引、主键索引。 (按创建SQL代码分类)

(1) 普通索引
由关键字KEY或INDEX定义。任务是加快对数据的访问速度。允许被索引的数据列包含重复的值。
(2) 唯一索引
由关键字UNIQUE把它定义。唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。
(3) 主键索引
由关键字是 PRIMARY定义。创建表时一般为主键字段创建一个索引,这个索引就是所谓的”主索引”。主索引与唯一索引的唯一区别是:前者在定义时使用的关键字是 PRIMARY而不是UNIQUE。

1.5.2. 聚簇索引和非聚簇索引[5]

(1) 聚簇索引

聚簇索引的顺序就是数据的物理存储顺序。聚簇索引的叶节点就是数据节点。

(2) 非聚簇索引

索引顺序与数据物理排列顺序无关。非聚簇索引的页节点仍然是索引检点,并保留一个链接指向对应数据块。

1.5.3. BTreeHash索引[6]

Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。

两种索引对比:[7]
(1) hash索引查找数据基本上能一次定位数据,当然有大量碰撞的话性能也会下降。而btree索引就得在节点上挨着查找了,很明显在数据精确查找方面hash索引的效率是要高于btree的。
(2) 那么不精确查找呢,也很明显,因为hash算法是基于等值计算的,所以对于“like”等范围查找hash索引无效,不支持。
(3) 对于btree支持的联合索引的最优前缀,hash也是无法支持的,联合索引中的字段要么全用要么全不用。提起最优前缀居然都泛起迷糊了,看来有时候放空得太厉害。
(4) hash不支持索引排序,索引值和计算出来的hash值大小并不一定一致。
(5) Hash 索引在任何时候都不能避免表扫描。
由于不同索引键存在相同 Hash 值,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。

2. 索引设计原则[8]

(1) 选择唯一性索引

唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。例如,学生表中学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的信息。如果使用姓名的话,可能存在同名现象,从而降低查询速度。

(2) 为经常需要排序、分组和联合操作的字段建立索引

经常需要ORDER BYGROUP BYDISTINCTUNION等操作的字段,排序操作会浪费很多时间。如果为其建立索引,可以有效地避免排序操作。

(3) 为常作为查询条件的字段建立索引

如果某个字段经常用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。因此,为这样的字段建立索引,可以提高整个表的查询速度。

(4) 限制索引的数目

索引的数目不是越多越好。每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。修改表时,对索引的重构和更新很麻烦。越多的索引,会使更新表变得很浪费时间。

(5) 尽量使用数据量少的索引

如果索引的值很长,那么查询的速度会受到影响。例如,对一个CHAR100)类型的字段进行全文检索需要的时间肯定要比对CHAR10)类型的字段需要的时间要多。

(6) 尽量使用前缀来索引

如果索引字段的值很长,最好使用值的前缀来索引。例如,TEXTBLOG类型的字段,进行全文检索会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。

(7) 删除不再使用或者很少使用的索引

表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再需要。数据库管理员应当定期找出这些索引,将它们删除,从而减少索引对更新操作的影响。

3. 索引建立和删除[9]

3.1 索引创建

在执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEXALTER TABLE来为表增加索引。

3.1.1. ALTER TABLE

ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。

ALTER TABLE table_name ADD INDEX index_name (column_list)

ALTER TABLE table_name ADD UNIQUE (column_list)

ALTER TABLE table_name ADD PRIMARY KEY (column_list)

其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。索引名index_name可选,缺省时,MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。

3.1.2. CREATE INDEX

CREATE INDEX可对表增加普通索引或UNIQUE索引。

CREATE INDEX index_name ON table_name (column_list)

CREATE UNIQUE INDEX index_name ON table_name (column_list)

table_nameindex_namecolumn_list具有与ALTER TABLE语句中相同的含义,索引名不可选。另外,不能用CREATE INDEX语句创建PRIMARY KEY索引。

3.2 索引删除

可利用ALTER TABLEDROP INDEX语句来删除索引。类似于CREATE INDEX语句,DROP INDEX可以在ALTER TABLE内部作为一条语句处理,语法如下。

DROP INDEX index_name ON talbe_name

ALTER TABLE table_name DROP INDEX index_name

ALTER TABLE table_name DROP PRIMARY KEY

其中,前两条语句是等价的,删除掉table_name中的索引index_name

3条语句只在删除PRIMARY KEY索引时使用,因为一个表只可能有一个PRIMARY KEY索引,因此不需要指定索引名。如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。

如果从表中删除了某列,则索引会受到影响。对于多列组合的索引,如果删除其中的某列,则该列也会从索引中删除。如果删除组成索引的所有列,则整个索引将被删除。

4. 索引实验

(1) 创建表、插入数据

create database mysql_learning;

use Mysql_learning;

create table person (

id int(10) not null,

name varchar(255) not null,

birthday date

);

insert into person values (2010195, 'xiao ming', '2001-01-01');

insert into person values (2010196, 'xiao hong', '2002-01-01');

insert into person values (2010197, 'xiao ming', '2003-01-01');

(2) 查看索引

show index from person;

返回结果为空

show keys from person;

返回结果为空

select * from person where id=2010195;

(3) 创建普通索引

create index index_id on person(id);

(4) 数据查询

select * from person where id=2010195;

就三行数据,结果不明显。

(5) 查看索引

show index from person;

show keys from person;

(6) 删除索引

drop index index_id on person;

show index from person;

返回结果为空

show keys from person;

返回结果为空

(7) 创建唯一索引

create unique index index_id on person(id);

drop index index_id on person;

create unique index index_name on person(name);

参考:

[1] http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html

[2] http://baike.baidu.com/subview/262241/8045149.htm?fr=aladdin

[3] http://www.cnblogs.com/skylaugh/archive/2006/08/04/467516.html

[4] http://database.51cto.com/art/201103/252461.htm

[5] http://www.cnblogs.com/zhenyulu/articles/25794.html

[6] http://www.cnblogs.com/vicenteforever/articles/1789613.html

[7] http://blog.csdn.net/tonyxf121/article/details/7976824

[8] http://blog.chinaunix.net/uid-26602509-id-3138126.html

[9] http://www.cnblogs.com/tianhuilove/archive/2011/09/05/2167795.html

转载于:https://www.cnblogs.com/kereturn/p/4113001.html

相关文章:

js多维数组渲染HTML js for循环渲染页面

微信小程序开发交流qq群 581478349 承接微信小程序开发。扫码加微信。 直接上代码&#xff0c;有不懂的可以留言。 <!DOCTYPE html> <html><head><meta charset"UTF-8"><script src"https://cdn.bootcss.com/jquery/2.1.1/jquery…

使用TensorFlow跟踪千年猎鹰

by Nick Bourdakos由Nick Bourdakos 使用TensorFlow跟踪千年猎鹰 (Tracking the Millennium Falcon with TensorFlow) At the time of writing this post, most of the big tech companies (such as IBM, Google, Microsoft, and Amazon) have easy-to-use visual recognition…

POJ2387 Til the Cows Come Home -DIJKSTRA 练习

题目大意是&#xff1a;有N个牛棚和T条边相连&#xff0c;每条边有个权值&#xff0c;问1号到N号牛棚之间的最短距离 本题是又是DIJKSTRA最短路水题&#xff0c;注意任何两个牛棚之间可能有多条路相连&#xff0c;输入时先输入边&#xff0c;再输入点&#xff0c;程序如下&…

<a>标签带参数跳转并在下一个页面接收

微信小程序开发交流qq群 581478349 承接微信小程序开发。扫码加微信。 正文&#xff1a; <a href"home.html?id1">跳转</a> //home.html <script type"text/javascript"> var aGetRequest();console.log("id:"a[id]) //…

Linux上PHP加入环境变量

export PATH$PATH:/usr/local/php/bin转载于:https://www.cnblogs.com/ttiandeng/p/6554902.html

计算机本科学位有用吗_我应该回到学校获得计算机科学学位吗?

计算机本科学位有用吗by Preethi Kasireddy通过Preethi Kasireddy 我应该回到学校获得计算机科学学位吗&#xff1f; (Should I go back to school to get a Computer Science degree?) This week’s question for my “Ask Preethi’ series is one that’s near and dear t…

[bzoj1054][HAOI2008]移动玩具

题意&#xff1a;在一个4*4的方框内摆放了若干个相同的玩具&#xff0c;某人想将这些玩具重新摆放成为他心中理想的状态&#xff0c;规定移动 时只能将玩具向上下左右四个方向移动&#xff0c;并且移动的位置不能有玩具&#xff0c;请你用最少的移动次数将初始的玩具状态移动到…

微信小程序实现滑动tab切换和点击tab切换并显示相应的数据(附源代码)

微信小程序开发交流qq群 581478349 承接微信小程序开发。扫码加微信。 正文&#xff1a; 先上效果图&#xff1a; 这里主要用到了swiper组件和三目运算&#xff0c;直接上代码&#xff0c; 样式只有三个class&#xff0c;简单粗暴&#xff0c;懒的小伙伴们可以直接拿来用&a…

使用java.util.Timer来周期性的执行制定的任务

使用java.util.Timer来周期性的执行制定的任务 1 public class HandlerTest extends Activity {2 int[] images new int[] {3 R.drawable.baiyang, R.drawable.jinniu, R.drawable.shuangyu4 };5 6 int currentImageID 0;7 8 Override9 prot…

数据库更行通知_哪个更好? 数据驱动还是数据通知?

数据库更行通知by Casper Sermsuksan由Casper Sermsuksan 哪个更好&#xff1f; 数据驱动还是数据通知&#xff1f; (Which is better? Data-Driven or Data-Informed?) I recently spoke at the Tech in Asia Product Development Conference in Jakarta about being data-…

从某一日期开始过day天的日期

一个SX问我的&#xff0c;我就写了写......从2010.1.1开始&#xff0c;给了一组测试数据3的话输出2010.1.4星期1&#xff0c;所以说2010.1.1是星期五&#xff0c;总星期就是 (day5)%70?7:(day5)%7下面是代码...... #include <iostream> #include <stdlib.h> using…

dhtmlxgrid表格笔记

因为公司以前架构的需求&#xff0c;所以对于dhtmlxgrid进行了简单的学习&#xff0c;参照dhtmlxgrid给出的例子进行摸索 1、必须引入的js包 <link rel"STYLESHEET" type"text/css" href"css/dhtmlxgrid.css"> <link rel"stylesh…

配置 腾讯云 SSL 证书 SSL证书实现https,环境:phpStudy下Apache环境

微信小程序开发交流qq群 581478349 承接微信小程序开发。扫码加微信。 正文&#xff1a; SSL证书实现https&#xff0c;环境&#xff1a;phpStudy下Apache环境 前提条件&#xff1a; 1.申请并下载好腾讯云申请的免费 ssl证书 腾讯云免费证书申请地址&#xff1a; http…

把canvas放在盒子内_如何将您的专业知识放在盒子中并出售

把canvas放在盒子内At RISE Conf in Hong Kong, Gary Vaynerchuk was asked:在香港的RISE Con​​f会议上&#xff0c; 加里韦纳楚克被问到&#xff1a; How do I make a living off my passion?我如何以激情为生&#xff1f; The answer from the marketing mogul was strai…

bzoj 4771: 七彩树 树链的并+可持久化线段树

题目大意: 给定一颗树,询问树中某个点x的子树中与其距离不超过d的所有点中本质不同的颜色数 强制在线 题解: 一下午终于把这道题叉掉了。 写了三个算法,前两个都是错的,后一个是%的网上大爷们的题解. 首先我们发现这道题有一个特点:没有修改操作 !! 这就使我们能够对颜色进行预…

Chapter 0: 引论

引论我之前就看过了&#xff0c;在我刚买到这本书的时候。 而我买这本书的日子&#xff0c;已经是两年前了。我就是这样子的&#xff0c;我买了好多好多关于技术的书&#xff0c;这些书都是很贵很贵的&#xff0c;可是买完回来之后就看了第一章&#xff0c;然后就一直丢在一边&…

开发常用CSS

微信小程序开发交流qq群 581478349 承接微信小程序开发。扫码加微信。 正文&#xff1a; keyframes -> 使 div 元素匀速向下移动 div{animation:myanimation 5s infinite;} keyframes myanimation {from {top:0px;}to {top:200px;}} 注:animation ->Css3动画属性 …

javascript网络_没有JavaScript的网络外观

javascript网络A Berlin-based web developer — who codes JavaScript for a living — decided to go an entire day without JavaScript.一家位于柏林的网络开发人员(为JavaScript编写代码为生)决定不使用JavaScript进行一整天的工作。 Let’s face it — in an insane wor…

js中的各种宽高以及位置总结

在javascript中操作dom节点让其运动的时候&#xff0c;常常会涉及到各种宽高以及位置坐标等概念&#xff0c;如果不能很好地理解这些属性所代表的意义&#xff0c;就不能理解js的运动原理&#xff0c;同时&#xff0c;由于这些属性概念较多&#xff0c;加上浏览器之间 实现方式…

关于百度编辑器UEditor在asp.net中的使用方法!

为了完成自己想要的功能效果&#xff0c;在项目中使用到了百度编辑器&#xff0c;为了搞明白&#xff0c;苦心学习查资料搞了整整一天&#xff0c;总结一下。 在asp.net 的项目中目前我觉得有两种情况&#xff0c;一种是没有使用模板页的&#xff0c;一种是使用了模板页的&…

微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能

微信小程序开发交流qq群 581478349 承接微信小程序开发。扫码加微信。 正文&#xff1a; 先上效果图&#xff0c;再附上完整源码&#xff1a; 1.多张图片循环渲染后预览、保存、识别带参数二维码 <view wx:for"{{imgalist}}" class"previewimg">…

vba编程教程视频教程_我已经完成了编程教程。 怎么办?

vba编程教程视频教程by Preethi Kasireddy通过Preethi Kasireddy 我已经完成了编程教程。 怎么办&#xff1f; (I’ve done programming tutorials. Now what?) This week’s question for my Ask Preethi series is about how to go from simply doing tutorials to the act…

【官方文档】Nginx负载均衡学习笔记(二)负载均衡基本概念介绍

简介 负载均衡&#xff08;Server Load Balancer&#xff09;是将访问流量根据转发策略分发到后端多台 ECS 的流量分发控制服务。负载均衡可以通过流量分发扩展应用系统对外的服务能力&#xff0c;通过消除单点故障提升应用系统的可用性。 负载均衡主要有如下几个功能点&#x…

微信小程序本地缓存

微信小程序开发交流qq群 581478349 承接微信小程序开发。扫码加微信。 正文&#xff1a; 关于微信小程序本地缓存&#xff0c;做一下笔记&#xff0c;希望能够帮助到看到这篇分享的人 //index.js 这里是保存 var a 1 wx.setStorageSync(a, a) //logo.js 这里是取保存的…

css 形状_在CSS形状之外思考

css 形状CSS is based off a box model. If you have an image that is a circle that you want to wrap text around, it will wrap around the images’ bounding box.CSS基于盒模型。 如果您要环绕的图像是一个圆&#xff0c;则它将环绕图像的边界框。 外型 (Shape-outside…

js-ES6学习笔记-module(4)

1、<script>标签打开defer或async属性&#xff0c;脚本就会异步加载。渲染引擎遇到这一行命令&#xff0c;就会开始下载外部脚本&#xff0c;但不会等它下载和执行&#xff0c;而是直接执行后面的命令。 defer与async的区别是&#xff1a;前者要等到整个页面正常渲染结束…

图像边缘检测--OpenCV之cvCanny函数

图像边缘检测--OpenCV之cvCanny函数 分类&#xff1a; C/C void cvCanny( const CvArr* image, CvArr* edges, double threshold1, double threshold2, int aperture_size3 ); image单通道输入图像.edges单通道存储边缘的输出图像threshold1第一个阈值threshold2第二个阈值aper…

微信小程序 封装网络请求并调用

微信小程序开发交流qq群 526474645 正文&#xff1a; util.js // 网络请求 const request function(url, method, data, msg, succ, fail, com) {// 小程序顶部显示Loadingwx.showNavigationBarLoading();if (msg ! "") {wx.showLoading({title: msg})}wx.requ…

什么是导师负责制_为什么一个导师是不够的

什么是导师负责制by Rick West由里克韦斯特(Rick West) 为什么一个导师是不够的 (Why one mentor just isn’t enough) A mentor can give career guidance and help with learning. They can teach you how to solve problems, network, and the list goes on.导师可以提供职…

CodeForces 114B 【STL应用】

思路&#xff1a; 原来string类能sort 和 swap....太强了.... 注意&#xff1a;字典序最小输出&#xff0c;因为某个地方写挫了&#xff0c;sort了n发&#xff0c;代码挫。 #include <bits/stdc.h> using namespace std; typedef long long LL;int tol; map<string,in…