谈谈你对索引的理解

索引是一个单独的、存储在磁盘上的数据库结构,包含着对数据表里所有记录的引用指针。使用索引可以快速找出在某个或多个列中有一特定值的行,所有MySQL列类型都可以被索引,对相关列使用索引是提高查询操作速度的最佳途径。

优点:

  1. 通过创建唯一索引,可以保证数据库表中每一行数据的唯一性。

  2. 可以大大加快数据的查询速度,这也是创建索引的主要原因。

  3. 在实现数据的参考完整性方面,可以加速表和表之间的连接。

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

缺点:

  1. 创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加。

  2. 索引需要占磁盘空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果有大量的索引,索引文件可能比数据文件更快达到最大文件尺寸。

  3. 当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,这样就降低了数据的维护速度。

索引有哪几种

  1. 普通索引和唯一索引

    普通索引是MySQL中的基本索引类型,允许在定义索引的列中插入重复值和空值。

    唯一索引要求索引列的值唯一,允许有空值。如果是组合索引,则列值的组合必须唯一。

    主键索引是一种特殊的唯一索引,不允许有空值。

  2. 单列索引和组合索引

    单列索引即一个索引只包含单个列,一个表可以有多个单列索引。

    组合索引是指在表的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用。

  3. 全文索引

    全文索引类型为FULLTEXT,在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空值。

  4. 空间索引

    空间索引是对空间数据类型的字段建立的索引。MySQL使用SPATIAL关键字进行扩展,使得能够用创建正规索引类似的语法创建空间索引。创建空间索引的列,必须将其声明为NOT NULL,空间索引只能在存储引擎为MyISAM的表中创建。

聚集索引和非聚集索引

聚集索引:

表数据按照索引的顺序来存储,索引项的顺序与表中记录的物理顺序一致。对于聚类索引,叶子节点存储了真实的数据行,不再有单独的数据页。一张表最多只能有一个聚类索引。

非聚集索引:

表数据存储顺序与索引顺序无关。对于非聚集索引,叶节点包含索引字段值以及指向数据页,数据行的逻辑指针。

创建索引的方法

一.create

基本语法:

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name  ON table_name (col_name [length],...) [ASC|DESC]

案例:

CREATE INDEX index_name
ON table_name (column)
USING BTREE;

index_name 是索引的名称,table_name 是要在其上创建索引的表的名称,column1、column2、... 是要在其上创建索引的列的名称。可以在括号中指定多个列。使用using字句设置索引类型,创建了一个 B-tree 类型的索引

二.alter

基本语法:

ALTER TABLE table_name ADD  [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [index_name] (col_name[length],...) [ASC|DESC]

案例

ALTER TABLE book ADD UNIQUE INDEX UniqidIdx (bookId);

在bookId字段上建立名称为UniqidIdx的唯一索引

MySQL怎么判断要不要加索引

建议按照如下的原则来创建索引:

  1. 当唯一性是某种数据本身的特征时,指定唯一索引。使用唯一索引需能确保定义的列的数据完整性,以提高查询速度。

  2. 在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引,如果待排序的列有多个,可以在这些列上建立组合索引。

只要创建了索引,就一定会走索引吗?

不一定。

比如,在使用组合索引的时候,如果没有遵从“最左前缀”的原则进行搜索,则索引是不起作用的。

判断索引有没有生效

可以使用EXPLAIN语句查看索引是否正在使用。

举例,假设已经创建了book表,并已经在其year_publication字段上建立了普通索引。执行如下语句:

EXPLAIN SELECT * FROM book WHERE year_publication=1990;

EXPLAIN语句将为我们输出详细的SQL执行信息,其中:

  • possible_keys行给出了MySQL在搜索数据记录时可选用的各个索引。

  • key行是MySQL实际选用的索引。

如果possible_keys行和key行都包含year_publication字段,则说明在查询时使用了该索引。

MySQL的索引为什么用B+树?

B+树由B树和索引顺序访问方法演化而来,它是为磁盘或其他直接存取辅助设备设计的一种平衡查找树,在B+树中,所有记录节点都是按键值的大小顺序存放在同一层的叶子节点,各叶子节点通过指针进行链接。如下图:

B+树索引在数据库中的一个特点就是高扇出性,例如在InnoDB存储引擎中,每个页的大小为16KB。在数据库中,B+树的高度一般都在2~4层,这意味着查找某一键值最多只需要2到4次IO操作,这还不错。因为现在一般的磁盘每秒至少可以做100次IO操作,2~4次的IO操作意味着查询时间只需0.02~0.04秒。

模糊查询语句中如何使用索引?

方法一:

反转模糊查询的字段,但是注意,对于"%keywork%"的索引,此方法是无效的。

如:

select * from student where name like '%三';

改为:

select * from student where reverse(name) like reverse('%三');

方法二:

like查询百分号前置,并不是100%不会走索引。如果只select索引字段,或者select索引字段和主键,也会走索引的。

数据库面试题——索引(一)相关推荐

  1. 混合索引_数据库面试题:查询在什么情况下不?索引-数据库知识点

    查询在什么情况下不⾛索引 数据库面试题 ⾸先,我们可以说通过explain去排查⼀个慢查询,进⽽找到它的索引(参看第五题),当创建索引却不⾛索引时,我们就需要考虑到优化器的问题. 在⼀条单表查询语句真 ...

  2. datagrid如何获取一行数据中的某个字段值_或许是全网最全面关于数据库面试题...

    原文: https://www.enmotech.com/web/detail/1/794/1.html 两万字全面论述数据库面试题(上) https://www.enmotech.com/web/d ...

  3. 计网/数据库面试题(更新中ing~~)

    计网/数据库面试题(更新中ing~~) <计算机网络> 1. OSI七层模型.设备 (传输层)协议的多路分用和复用 2. TCP/IP四层模型==五层模型 (传输层)TCP和UDP协议对比 ...

  4. SQL编程软件测试,编程程题库之软件测试8大常见数据库面试题

    原标题:编程程题库之软件测试8大常见数据库面试题 一.事务的四大特性 原子性,要么执行,要么不执行 隔离性,所有操作全部执行完以前其它会话不能看到过程一致性,事务前后,数据总额一致持久性,一旦事务提交 ...

  5. mysql纵表 主键_数据库面试题-sql语句

    原标题:数据库面试题-sql语句 1,写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的. 答: → 解1: select top ...

  6. C# 联合查询_直击数据库面试题:数据库查询语句

    Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 问题 ...

  7. MySQL数据库面试题(2021最新版)

    文章目录:http://github.crmeb.net/u/defu 数据库基础知识 为什么要使用数据库 什么是SQL? 什么是MySQL? 数据库三大范式是什么 mysql有关权限的表都有哪几个 ...

  8. Oracle数据库面试题 精选 Oracle 面试题

    Oracle数据库面试题 1.解释冷备份和热备份的不同点以及各自的优点 冷备份 发生在数据库已经正常关闭的情况下,将关键性文件拷贝到另外位置的一种说法.适用于所有模式的数据库. 优点 1. 是非常快速 ...

  9. 复试面试-数据库面试题

    将网上常见的数据库面试题整理一下,方便自己和有需要的人学习. 1.事务 概念:访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位.事务由事务开 ...

最新文章

  1. 推荐7款实用强大的神器工具,建议你先收藏,总有一天你会用到!
  2. Vue中动态设置页面title
  3. 如何在Python中附加文件?
  4. 图说数据中心新风节能技术
  5. 彩色手绘情节人插画装饰素材,psd分层利于应用!
  6. php pdo 存储过程的返回所有结果,PHP_PDO 调用存储过程,返回参数问题
  7. L1-047 装睡-PAT团体程序设计天梯赛GPLT
  8. 10种用户友好的验证码
  9. matlab 修正后阿尔法,修正后的阿尔法均值滤波器Alpha.ppt
  10. 谈谈象棋的基本功《二》复盘篇
  11. 阿里无线11.11 | 手机淘宝主会场实践之路
  12. 美女画廊(点击上面的图片下面进行显示)
  13. 如何在软件开发行业选择一条正确的职业道路?
  14. pip install lap出现问题
  15. 防灾科技学院图书馆大数据分析,2018读书报告丨来看一下谁是全年的阅读之星?
  16. 周鸿袆:给程序员忠言逆耳的几条建议
  17. R语言实战应用精讲50篇(三十)-R语言ggplot2绘制精美高级地图
  18. cba比赛比分预测_今晚五场CBA比赛预测
  19. Windows资源管理器占用内存暴涨解决/无响应处理方案
  20. 服务器共享文档密码设置,服务器共享模式怎么设置密码

热门文章

  1. 计算机b级考试题型分值分布,大学英语四级考试题型和分值分配
  2. 协同过滤算法(基于用户)
  3. springboot整合ActiveMQ(点对点和发布订阅)
  4. Visual Studio 2008 安装出错 无法安装 的解决办法
  5. Php session_start错误,PHP 解决错误:Warning: session_start()... 的方法
  6. 仿抖音点赞效果实现 ——————自定义View
  7. LInux上返回到切换目录前的目录
  8. Linux 块子系统优化
  9. mysql客户端如何登录_MySQL-客户端登录问题
  10. CSS漂亮搜索框代码