一文弄懂MySQL索引创建原则

一、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日

相关文章

  • oracle中动态SQL使用详细介绍

    Oracle中动态SQL使用详细介绍 动态SQL是指程序运行时根据不同情况生成、修改和执行SQL语句的过程,它比静态SQL更加灵活。Oracle数据库中动态SQL主要有以下两种实现方式: 使用EXECUTE IMMEDIATE语句 使用DBMS_SQL包 1. 使用EXECUTE IMMEDIATE语句 EXECUTE IMMEDIATE语句是Oracle的…

    database 2023年5月21日
    00
  • mysql开启主从复制

    主数据库配置:vim /etc/my.cnf server_id=146 #一般设置ip最后一位 log-bin=mysql-bin #开启bin-log binlog_do_db=test #生成test数据库binlog_do_db=sss #生成sss数据库binlog_ignore_db=sss #忽略数据库#查看配置是否生效 show VARIAB…

    MySQL 2023年4月13日
    00
  • MySQL的DATE_FORMAT函数的使用

    MySQL的DATE_FORMAT函数是用于将日期转换为指定格式字符串的函数,它的语法如下: DATE_FORMAT(date,format) 其中,date表示要格式化的日期,format表示要格式化的格式,返回一个字符串类型值。 下面是几个常用的format格式: %Y: 表示年份,例如: 2021 %m: 表示月份,例如:01、02、03等 %d: 表…

    database 2023年5月22日
    00
  • c# 数据库的 sql 参数封装类的编写

    编写 C# 数据库的 SQL 参数封装类的步骤如下: 1. 建立参数封装类 SQL 参数封装类是用于创建、附加 SQL 查询或存储过程的参数的类。通常,这些类包含一个构造函数和一组属性,以用于容纳查询必需的所有参数。以下是建立参数封装类的步骤: 创建一个新的 C# 类,并起一个有意义的名称。通常,类名应该反映该类的用途。 在该类中,定义构造函数来设置必需的参…

    database 2023年5月21日
    00
  • PostgreSQL使用MySQL外表的步骤详解(mysql_fdw)

    PostgreSQL使用MySQL外表的步骤详解(mysql_fdw) MySQL外表(fdw)允许PostgreSQL服务器访问远程MySQL服务器上的数据,就好像它们存在于PostgreSQL本地一样。这可以极大地简化数据集成,特别是在需要合并来自不同数据库的数据时。 下面是使用mysql_fdw的步骤以及具体操作: 步骤一:安装mysql_fdw 首先…

    database 2023年5月22日
    00
  • MySQL的安装与配置详细教程

    下面就为你讲解MySQL的安装与配置详细教程。 安装MySQL Step 1:下载MySQL安装文件 首先,我们需要下载MySQL的安装文件。你可以在官网下载页面选择适合你操作系统的安装文件(https://dev.mysql.com/downloads/mysql/)。这里以Linux系统为例,下载对应的二进制安装包: wget https://dev.m…

    database 2023年5月22日
    00
  • 在MySQL中使用JOIN语句进行连接操作的详细教程

    下面是详细讲解“在MySQL中使用JOIN语句进行连接操作的详细教程”的完整攻略。 使用JOIN语句进行连接操作的基本概念 在MySQL中,JOIN语句是用于连接两个或更多表的语句。使用JOIN语句可以将多个表中的数据“拼接”起来,以实现更加强大的查询功能。JOIN语句主要包括如下几种类型: INNER JOIN:内连接,只查询同时存在于两个表中的数据。 L…

    database 2023年5月22日
    00
  • 8种MySQL分页方法总结

    8种MySQL分页方法总结 在进行数据库查询时,经常会遇到需要分页显示结果的情况。MySQL提供了多种分页方法,本文将总结8种常用的MySQL分页方法,并给出示例说明。 1. LIMIT offset, num 此方法是MySQL最常用的分页方法。其中,offset表示从结果集的第几行开始返回结果,num表示返回的行数。 示例1: SELECT * FROM…

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