MySQL入门(五) MySQL中的索引详讲

MySQL入门(五) MySQL中的索引详讲

索引概述

索引(Index)是在数据库表中建立起的一种数据结构,可以用来大大提高数据库表的检索效率。与数据检索方式不同,通过建立索引可以使用类似二分法的算法来快速定位到目标数据,避免了全表扫描,大大提高了查询效率。

当我们需要从一张表中查询数据行时,如果没有使用索引,MySQL将会做全表扫描(Full Table Scan),也就是将表中的每一行都读取一遍,效率非常低下。而使用索引后,MySQL只需要查找索引表,根据索引表中存储的指针快速找到所需要的数据行,因此查询速度可以大大提升。

索引的作用

  1. 加速查询:通过索引定位到所需数据行的过程,比遍历整张表要快得多。
  2. 保障数据唯一性:可以对建立索引的列添加唯一性约束,保障表中的数据不会重复。
  3. 优化排序:索引也可用于优化某些排序操作,特别是针对大表时,作用尤为显著。

索引的分类

  1. 普通索引:最基本的索引类型,没有任何约束条件。

    CREATE INDEX index_name ON table_name(column_name)

  2. 唯一索引:建立后要求索引列的值必须是唯一的,可用于保障数据的唯一性。

    CREATE UNIQUE INDEX index_name ON table_name(column_name)

  3. 主键索引:唯一索引的一种特殊形式,用于保障数据的唯一性,并将该列设置为数据表的主键。

    ALTER TABLE table_name ADD PRIMARY KEY(column_name)

  4. 全文索引:只能用于MyISAM和InnoDB存储引擎,用于对表中的文字进行全文检索。

    CREATE FULLTEXT INDEX index_name ON table_name(column_name)

索引的优点与缺点

优点
  1. 大大减少了查询全表时所需的扫描量,缩短了查询时间。
  2. 数据与索引分离,便于快速重建索引。
  3. 利用索引组织数据,可以方便的实现数据的排序。
  4. 可以通过唯一索引添加约束条件,保持数据的完整性和正确性。
缺点
  1. 索引需要占据额外的磁盘空间。
  2. 索引在插入、更新、删除数据的时候会产生额外的开销。
  3. 创建索引的过多会消耗大量的时间和资源,降低数据库性能。
  4. 不同类型的查询需要建立不同的索引,索引的维护成本较高。

创建索引的注意事项

  1. 需要根据实际需求创建适合的索引类型,不同场景下需要创建的索引类型可能也不同。
  2. 只有大表中的字段才需要创建索引,小表反而会因为索引的创建带来的额外开销。
  3. 索引列的值越大,索引的效率越低,需要尽可能的缩小索引列的数据范围。
  4. 不要创建重复的索引,除非需要在同一列上建立不同类型的索引。
  5. 索引所涉及的列尽量不要使用函数、表达式或者计算复杂的SQL语句,这会降低索引的利用效果。
  6. 减少字符串类型索引的长度可以有效地提高索引查询效率。
  7. 在MySQL中,索引也需要进行优化,在应用中需要进行适当的调整和维护。

示例说明

假设有一张数据表student,需要从表中查询年龄为20岁的学生信息。需要创建一条针对年龄(age)列的索引,创建索引的SQL语句如下:

CREATE INDEX idx_age ON student(age)

然后,使用如下SQL语句查询年龄为20岁的学生信息:

SELECT * FROM student WHERE age = 20

查询结果会直接使用刚刚创建的索引定位到包含年龄为20岁的数据行,而不需要扫描整张表,大大提高了查询效率。

假设学生表中还有一个height列,需要对身高(height)进行排序。需要创建一条针对身高列(height)的索引,创建索引的SQL语句如下:

CREATE INDEX idx_height ON student(height)

然后,使用如下SQL查询语句查询学生表中身高最高的前五名学生:

SELECT * FROM student ORDER BY height DESC LIMIT 5

查询结果会使用刚刚创建的索引按照身高进行排序,而不需要扫描整张表,大大提高了排序操作的效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL入门(五) MySQL中的索引详讲 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 为什么Redis集群有16384个槽

    引言 我在《那些年用过的Redis集群架构(含面试解析)》一文里提到过,现在redis集群架构,redis cluster用的会比较多。如下图所示对于客户端请求的key,根据公式HASH_SLOT=CRC16(key) mod 16384,计算出映射到哪个分片上,然后Redis会去相应的节点进行操作! 那大家思考过,为什么有16384个槽么?ps:CRC16…

    Redis 2023年4月11日
    00
  • Redis 设计与实现(第十四章) — 服务器

    Redis服务器负责与客户端建立网络连接,之前的数据结构部分已经看过了,本章主要从下面三个方面讲解。 1.服务器执行命令的过程 2.serverCron函数的执行 3.服务器的初始化 服务器执行命令的过程 一个客户端请求命令的基本过程大致如下: 1.客户端发送请求命令给服务器,比如set key value; 2.服务器端接受命令并处理,在数据库中进行设置操…

    Redis 2023年4月12日
    00
  • oracle中误删除表后恢复语句(FLASHBACK)

    当误删了Oracle数据库中的表后,我们可以使用FLASHBACK语句来进行表的恢复。FLASHBACK的原理是通过回滚技术将已提交的事务进行回滚,使表回到误删除前的状态。下面是FLASHBACK的详细攻略: 1. 开启闪回功能 在使用FLASHBACK语句之前,需要确认是否已经开启了闪回功能,此处我们使用如下SQL语句查看当前系统的闪回状态: SELECT…

    database 2023年5月21日
    00
  • SQL和NoSQL之间的区别总结

    下面是关于SQL和NoSQL之间的区别总结的攻略。 SQL和NoSQL的区别 数据库类型的区别 SQL是关系型数据库管理系统(RDMS)的代表,它将数据存储到表格中,确保所有信息都具有相关性,同时支持结构化查询语言(SQL)来操作这些数据。 而NoSQL则不是以表格的形式来存储数据,它使用非关系型数据库,通常支持类似于JSON(JavaScript Obje…

    database 2023年5月22日
    00
  • 如何使用Python在MySQL中使用限制查询?

    在MySQL中,可以使用LIMIT子句对查询结果进行限制。在Python中,可以使用MySQL连接来执行限制查询。以下是在Python中使用限制查询的完整攻略,包括限制查询的基本语法、使用限制查询的示例以如在Python中使用限制查询。 限制查询的基本语法 限制查询的基本语法如下: column_name) FROM table_name LIMIT num…

    python 2023年5月12日
    00
  • 深入理解MySQL重做日志 redo log

    当我们在使用MySQL时,有时候会出现突然断电、宕机等异常情况,这时候就会出现数据丢失的问题。为了解决这个问题,MySQL提供了一个重做日志机制(redo log),以确保我们的数据在出现异常情况时也能够被恢复。在本文中,我们将如何深入理解MySQL的重做日志机制,以及如何使用它来保护我们的数据。 什么是重做日志(redo log) 重做日志(redo lo…

    database 2023年5月22日
    00
  • 系统高吞吐量下的数据库重复写入问题分析解决

    系统高吞吐量下的数据库重复写入问题分析解决 问题描述 在高吞吐的系统中,重复写入是常见的问题。当多个操作同时写入数据库时,如果没有使用正确的机制,就可能会出现数据重复写入的情况。这不仅仅会浪费数据库资源,还可能会影响数据的一致性。 问题分析 重复写入问题是出现在多个操作同时写入数据库时,这些操作之间互相竞争资源,从而导致数据重复写入。解决这个问题的方法有很多…

    database 2023年5月22日
    00
  • 阿里云Linux CentOS 7.2下自建MySQL的root密码忘记的解决方法

    阿里云Linux CentOS 7.2下自建MySQL的root密码忘记的解决方法 在使用阿里云Linux CentOS 7.2下自建MySQL时,有时候会遇到忘记root账户的密码的问题。本文将详细介绍解决这一问题的方法。 方法一:使用mysqld_safe 停止MySQL服务 sudo systemctl stop mysqld 使用下面的命令启动mys…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部