一文弄懂MySQL索引创建原则

yizhihongxing

一、MySQL索引简介

MySQL的索引是查询优化的关键,索引可以大大加快数据的检索速度。索引可以看作是目录,它们可以在查询中快速地定位到满足条件的数据。MySQL支持以下类型的索引:

  • B-tree索引:B-tree是平衡树,并且是一种多路搜索树,这个树的每个节点最多包含k个孩子。
  • B+tree索引:B+tree是B-tree树的一种变形。相对于B-tree它有更高的磁盘和内存访问效率,且能够保持稳定的性能。
  • 哈希索引: 基于哈希表实现的,只有精确匹配索引所有列时才有效。对于任何需要进行范围查找的情况,哈希索引都无法正常使用。

本文以B-tree索引为例讲解MySQL索引的创建原则。

二、索引创建原则

  1. 最左前缀原则

在MySQL中,如果一个查询中出现了索引的前缀顺序,则查询可以通过索引完成,否则无法使用。所以使用索引时,应该将访问最高、最具限制性的条件定义在索引的前面。

例如:

SELECT * FROM emp WHERE job='Manager' AND deptno=20;

建立(job,deptno)索引,能够满足该查询条件。因为表中只有job有过过多数据,所以通过job来过滤数据是最具效率的。

而下面这个建立(deptno,job)索引的是错误的,因为在 WHERE 子句中没有出现了索引的第一个字段。如果这么建索引,将无法使用(deptno,job)索引进行查询。

  1. 索引列的选择性原则

选择性是指不重复的索引值(也称为基数)和数据表记录数(中的总行数)的比值。选择性越高的索引,查询效率越高。

例如:

SELECT * FROM emp WHERE job='Manager';

如果根据job字段建立索引,非常适合此查询场景,因为只有极少数记录的job等于'Manager'。

但这条规则也有例外,例如:当需要查询女性用户时,性别字段是比较合适的索引字段。然而,当查询新生儿的信息时,性别就不是可选择性良好的字段。

  1. 单列索引与复合索引的选择

当一个查询涉及到多个查询条件时,一般建议建立复合索引,但并非所有的查询都适合建立复合索引,这需要根据场景进行判断。

例如:

SELECT * FROM emp WHERE name='Jack' AND age=20;

建立(name, age)索引是比较合适的。

而下面这个建立两个单列索引的写法也没问题:

ALTER TABLE emp ADD INDEX name_index(name);
ALTER TABLE emp ADD INDEX age_index(age);

总之,选择单列索引还是复合索引,需要根据具体的使用场景进行判断。

三、示例说明

  1. 示例一

假设有一个学生表,需要查询学生名字为“张三”、性别为“女”、出生日期早于“2000-01-01”的所有数据,并且表中student_id字段为主键,因此必须建立索引优化查询性能。我们可以建立复合索引(name, sex, birth_date, student_id)来完成该查询。

CREATE INDEX name_sex_birth_date_index 
ON student (name, sex, birth_date, student_id);
  1. 示例二

假设有一个订单表,需要查询订单状态码在1和4之间、订单金额在100到300之间、订单日期在2020年4月之后的所有数据。由于该查询没有单个字段能满足,因此需要建立复合索引(order_date, order_status,order_amount)来优化查询效率。

CREATE INDEX order_date_status_amount_index 
ON orders (order_date, order_status, order_amount);

以上是“一文弄懂MySQL索引创建原则”的完整攻略及两条示例说明,建立合理的索引可以大幅提升数据库的查询性能,但是过多或者不合理的索引也会导致性能下降,因此需要仔细衡量索引的选择。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文弄懂MySQL索引创建原则 - Python技术站

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

相关文章

  • Django缓存优化之redis

         Redis 概述   Redis 是一个开源的Inmemory key-value 存储系统,性能高,很大程度上补偿了 memcached 的不足。支持多种存储类型,包括 string, list, set, zset(sorted set — 有序集合)和 hash。   Redis 优点   1)异常快速:Redis的速度非常快,每秒能执行约…

    Redis 2023年4月13日
    00
  • ER模型和RDBMS的区别

    ER模型和RDBMS都是数据库领域中很重要的概念,它们分别代表了两种不同的数据表示方式。 ER模型 ER模型(Entity-Relationship Model)是表示实体-关系之间联系的一种常见的数据模型。它利用图形符号来表示实体(Entity)、属性(Attributes)和实体之间的关系(Relationships)。在ER模型中,所有的实体和属性都可…

    database 2023年3月27日
    00
  • SQL Server–怎样用ADO在SQL SERVER中建库,建表

    让我用markdown格式为您详细讲解如何使用ADO在SQL Server中建库和建表。 在SQL Server中使用ADO建库和建表 首先,我们需要确保已经安装了SQL Server,并且了解一些SQL语句的基础知识。 步骤1: 创建一个连接对象 要在SQL Server中使用ADO,首先需要创建一个连接对象。以下是一个示例: Dim conn Set c…

    database 2023年5月21日
    00
  • C# Redis使用之StackExchange

    在.NET平台使用Redis需要做如下准备工作:   创建一个新的Visual Studio应用或者打开一个已经存在的Visual Studio应用。   打开NuGet程序包      搜索并添加StackExchange.Redis程序包    第2章   数据缓存 使用redis做为数据缓存服务 string host = “192.168.200.1…

    Redis 2023年4月11日
    00
  • linux下用Proftpd搭建ftp服务器及配置方法

    下面是 “linux下用Proftpd搭建ftp服务器及配置方法”的完整攻略。 安装Proftpd 在Linux中安装Proftpd的方式有多种,常见的两种方式是使用包管理器进行安装,或者从源代码编译安装。 使用包管理器进行安装 以Debian/Ubuntu为例,使用以下命令进行安装: sudo apt-get update sudo apt-get ins…

    database 2023年5月22日
    00
  • CentOS 8 安装 MariaDB的详细教程

    CentOS 8 安装 MariaDB 的详细教程 MariaDB 是 MySQL 的一个分支,是一个免费、开源的关系型数据库管理系统,适用于各种规模的应用程序和网站。本文将介绍 CentOS 8 如何安装 MariaDB 数据库。 准备工作 在开始安装 MariaDB 之前,请确保你已经安装了最新的 CentOS 8 系统,并拥有使用系统管理员 (root…

    database 2023年5月22日
    00
  • error while loading shared libraries xx.so处理方法

    当在 Linux 系统上运行一个程序时,如果弹出错误提示 error while loading shared libraries xx.so,会导致程序无法正常运行。这种错误一般是因为程序所依赖的共享库没有找到或者路径不正确。 针对这种错误,我们可以采用以下方法解决: 方法一:修改动态库搜索路径 修改动态库搜索路径的方法比较常见。可以在环境变量 LD_LI…

    database 2023年5月22日
    00
  • mysql中取系统当前时间,当前日期方便查询判定的代码

    要在 MySQL 中获取当前时间和日期,常见的方法是使用内置的 NOW() 函数或者使用 CURDATE() 和 CURTIME() 函数。 获取当前时间 要获取当前时间,可以使用 NOW() 函数,它返回当前日期和时间的值。例如: SELECT NOW(); 会返回如下格式的日期和时间: 2022-09-05 19:35:49 如果你想只获取当前时间的值,…

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