索引

在关系数据库中,如果有上万甚至上亿条记录,在查找记录的时候,想要获得非常快的速度,就需要使用索引。

索引是关系数据库中对某一列或多个列的值进行预排序的数据结构。通过使用索引,可以让数据库系统不必扫描整个表,而是直接定位到符合条件的记录,这样就大大加快了查询速度。

例如,对于students表:

idclass_idnamegenderscore11小明M90

21小红F95

31小军M88

如果要经常根据score列进行查询,就可以对score列创建索引:

ALTER TABLE students

ADD INDEX idx_score(score);

使用ADD INDEX idx_score (score)就创建了一个名称为idx_score,使用列score的索引。索引名称是任意的,索引如果有多列,可以在括号里依次写上,例如:

ALTER TABLE students

ADD INDEX idx_name_score(name,score);

索引的效率取决于索引列的值是否散列,即该列的值如果越互不相同,那么索引效率越高。反过来,如果记录的列存在大量相同的值,例如gender列,大约一半的记录值是M,另一半是F,因此,对该列创建索引就没有意义。

可以对一张表创建多个索引。索引的优点是提高了查询效率,缺点是在插入、更新和删除记录时,需要同时修改索引,因此,索引越多,插入、更新和删除记录的速度就越慢。

对于主键,关系数据库会自动对其创建主键索引。使用主键索引的效率是最高的,因为主键会保证绝对唯一。

唯一索引

在设计关系数据表的时候,看上去唯一的列,例如身份证号、邮箱地址等,因为他们具有业务含义,因此不宜作为主键。

但是,这些列根据业务要求,又具有唯一性约束:即不能出现两条记录存储了同一个身份证号。这个时候,就可以给该列添加一个唯一索引。例如,我们假设students表的name不能重复:

ALTER TABLE students

ADD UNIQUE INDEX uni_name(name);

通过UNIQUE关键字我们就添加了一个唯一索引。

也可以只对某一列添加一个唯一约束而不创建唯一索引:

ALTER TABLE students

ADD CONSTRAINT uni_name UNIQUE(name);

这种情况下,name列没有索引,但仍然具有唯一性保证。

无论是否创建索引,对于用户和应用程序来说,使用关系数据库不会有任何区别。这里的意思是说,当我们在数据库中查询时,如果有相应的索引可用,数据库系统就会自动使用索引来提高查询效率,如果没有索引,查询也能正常执行,只是速度会变慢。因此,索引可以在使用数据库的过程中逐步优化。

小结

通过对数据库表创建索引,可以提高查询速度。

通过创建唯一索引,可以保证某一列的值具有唯一性。

数据库索引对于用户和应用程序来说都是透明的。

读后有收获可以支付宝请作者喝咖啡

mysql 廖雪峰_关系模型 - 索引 - 《廖雪峰 SQL教程(MySQL)》 - IT Book相关推荐

  1. mongodb mysql 知乎_为什么 MongoDB 索引选择B-树,而 Mysql 索引选择B+树(精干总结)...

    本文献给准备面试或者是还在面试的你.常见面试题,送分题目,不拿白不拿.本文收录在个人博客<愚公要移山>中,地址 www.javachat.cc 这篇是修改版,针对知乎上很多人提出的问题,进 ...

  2. 视频教程-19全新mysql教程零基础入门实战精讲mysql视频DBA数据库视频教程SQL教程-MySQL

    19全新mysql教程零基础入门实战精讲mysql视频DBA数据库视频教程SQL教程 7年的开发架构经验,曾就职于国内一线互联网公司,开发工程师,现在是某创业公司技术负责人, 擅长语言有node/ja ...

  3. mysql第三章关系模型_一个MySQL关系模型只有三个关系(二维表)组成。_学小易找答案...

    [判断题]DELETE语句功能是对表中所有记录或满足条件的记录进行批量删除. [填空题]The computer's entire ____ was on a single board. [单选题]下 ...

  4. mysql内存淘汰_从创建索引过程中内存变化来看SQL Server与MySQL的内存淘汰算法

    在sqlserver中,几年之前就注意到一个现象:sqlserver中对一个大表创建索引或者rebuild索引的过程中,会引起内存剧烈的动荡,究其原因为何,这种现象到底正不正常,是不是sqlserve ...

  5. mysql 帮助命令_一篇文章帮你搞定所有MySQL命令!

    MySQL的基本操作可以包括两个方面:MySQL常用语句如高频率使用的增删改查(CRUD)语句和MySQL高级功能,如存储过程,触发器,事务处理等.而这两个方面又可以细分如下: MySQL常用语句 表 ...

  6. mysql sqlserver对比_很用心的写了 9 道 MySQL 面试题

    MySQL 一直是本人很薄弱的部分,后面会多输出 MySQL 的文章贡献给大家,毕竟 MySQL 涉及到数据存储.锁.磁盘寻道.分页等操作系统概念,而且互联网对 MySQL 的注重程度是不言而喻的,后 ...

  7. mysql拉荐_荐 一步一步教你MySQL主从复制读写分离

    本次我们通过docker搭建环境 虚拟机搭建对机器配置有要求,并且安装mysql步骤繁琐 一台机器上可以运行多个Docker容器 Docker容器之间相互独立,有独立ip,互不冲突 Docker使用步 ...

  8. mysql更新加锁_一条简单的更新语句,MySQL是如何加锁的?

    看如下一条sql语句: #tableT(idint,namevarchar(20))deletefromTwhereid=10: MySQL在执行的过程中,是如何加锁呢? 再看下面这条语句: sele ...

  9. 阿里云安装数据库mysql数据库服务器_阿里云CentOs服务器 安装与配置mysql数据库...

    Linux 安装mysql 数据库 一下为mysql 安装教程 Using username"root". Last login: Tue Oct8 09:30:34 2019 f ...

最新文章

  1. 该应用程序可能在其主线程上做过多的工作
  2. 上海网络推广浅析一个优质的404页面能给网站带来什么优化效果?
  3. RAID技术详细解答之一:入门基础篇
  4. C#流程控制语句--跳转语句(break,continue,goto,return,)
  5. Linux(12)-命令行的使用,shell脚本
  6. 整洁架构之道--三种经典的编程范式
  7. 吃鱼还是吃肉 (10 分)
  8. Thinkpad p15 gen1安装双系统遇到的问题
  9. instanceof应用场景 instanceof一般用于对象类型强制转换
  10. Hybrid 接口应用
  11. Java虚拟机类加载机制浅谈
  12. 85 缓存, 验证码 序列化
  13. ionCube 安装
  14. 域名和IP地址的区别
  15. ts类型声明文件的正确使用姿势
  16. 【小家java】Java中主线程(父线程)与子线程的通信和联系
  17. SDRAM中的DQM
  18. wireshark找不到捕获接口问题和net start npf 服务器名无效、拒绝访问的解决办法
  19. 计算机教室报损登记簿,瑞安市第四中学
  20. python常见运算符

热门文章

  1. elementui自定义进度条形状
  2. 搜索推广营销五步曲之三:方案制作之如何写好创意
  3. MacBook Pro16大小写键caps lock灯不亮的问题解决
  4. keil里的debug项里没有 proteus vsm 51解决方案
  5. G6309列车02车05D号
  6. 华工2018计算机网络随堂练习,计算机网络随堂练习-华工2019随堂练习
  7. kali安装dockers和docker-compose
  8. Arthas开源一周年,Github Star 16K,我们一直在坚持什么?
  9. 格斗机器人制造图纸_轮式格斗机器人的制作方法
  10. 2022-2028全球与中国消防无人机市场现状及未来发展趋势