一文弄懂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日

相关文章

  • Spring jpa和mybatis整合遇到的问题解析

    下面是Spring JPA和MyBatis整合遇到的问题解析完整攻略。 概述 Spring JPA是Spring Framework中的一种用于简化JPA(Java Persistence API)应用开发的框架,它大大简化了数据访问层的开发。而MyBatis是一种基于XML的持久层框架,与Spring JPA类似,也是用于简化数据访问层开发的。在某些情况下…

    database 2023年5月22日
    00
  • mysql索引失效的十大问题小结

    MySQL索引是优化查询性能的重要手段,但是有时候即使建立了索引也可能出现索引失效的情况。下面是MySQL索引失效的十大问题: 1. 查找NULL值 MySQL的B-Tree索引不适用于查找NULL值,如果查询条件是IS NULL或者IS NOT NULL时,MySQL必须扫描全表。可以使用覆盖索引和联合索引来优化这个问题。 2. 使用函数或者表达式进行计算…

    database 2023年5月22日
    00
  • PostgreSQL 查看数据库,索引,表,表空间大小的示例代码

    PostgreSQL 是一款十分流行的开源关系型数据库管理系统,非常适合用于数据分析、应用程序开发、Web 应用程序、GIS 应用等各种场景。在 PostgreSQL 中,我们可以通过各种命令和SQL语句来查询和管理我们的数据库、表、索引、表空间等对象。 以下是“PostgreSQL 查看数据库,索引,表,表空间大小”的示例代码攻略,以下示例均在Linux系…

    database 2023年5月19日
    00
  • mysql事务管理操作详解

    MySQL事务管理操作详解 MySQL事务是指SQL语句组成的逻辑处理单元,该单元要么全部执行成功,要么全部回滚。 事务由以下四个特性来定义:原子性、一致性、隔离性和持久性(ACID)。 原子性 原子性是指事务是最小的工作单元,它要么全部提交成功,要么全部回滚失败。在事务执行过程中,如果发生任何故障,那么整个事务将会失败,并且回滚到事务开始之前的状态。MyS…

    database 2023年5月22日
    00
  • SQL 在Oracle中把整数转换成二进制

    在Oracle中,我们可以使用内置函数TO_BINARY_INTEGER将整数转换为二进制。具体用法如下: SELECT TO_BINARY_INTEGER(10) FROM dual; 这个查询会返回二进制数1010,其中的dual是一个虚拟表,用于查询没有真正表格的数据。上述查询的结果表示将十进制数10转换为二进制数1010。 同样地,我们也可以使用TO…

    database 2023年3月27日
    00
  • Python 基于Python从mysql表读取千万数据实践

    基于Python 从mysql表读取千万数据实践   by:授客 QQ:1033553122 场景:   有以下两个表,两者都有一个表字段,名为waybill_no,我们需要从tl_waybill_bar_record表读取1000w条唯一的waybill_no,然后作为INSERT SQL语句的一部分,填充到ts_order_waybill的waybill…

    MySQL 2023年4月13日
    00
  • MySQL备份类型

    MySQL是一种用于管理数据的关系型数据库管理系统。MySQL备份是一种旨在保护数据库免遭数据丢失、损坏或被误删除等的操作,以便恢复数据库的数据的过程。MySQL备份有多种类型,包括物理备份、逻辑备份和增量备份。本文将详细介绍这三种类型。 物理备份 物理备份是备份数据库的一个镜像,包含所有数据和对象。它从硬盘级别上备份数据库,对所有表、数据和结构都会进行备份…

    MySQL 2023年3月10日
    00
  • MySQL 的CASE WHEN 语句使用说明

    在这里我将详细讲解“MySQL的CASE WHEN语句使用说明”: CASE WHEN语句概述 CASE WHEN语句是用来进行条件判断的函数,在MySQL中被广泛应用,在需要对查询结果进行处理或者对查询条件进行复杂的定制时,尤其使用频繁。 CASE WHEN语句格式 CASE WHEN语句格式如下: CASE expression WHEN conditi…

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