广告
返回顶部
首页 > 资讯 > 数据库 >Mysql 索引该如何设计与优化
  • 263
分享到

Mysql 索引该如何设计与优化

MySQL索引设计MySQL索引优化 2022-05-28 04:05:03 263人浏览 薄情痞子
摘要

什么是索引? 数据库索引是一种数据结构,它以额外的写入和存储空间为代价来提高数据库表上数据检索操作的速度。通俗来说,索引类似于书的目录,根据其中记录的页码可以快速找到所需的内容。——维基百科 常见索引有哪些?

什么是索引

数据库索引是一种数据结构,它以额外的写入和存储空间为代价来提高数据库表上数据检索操作的速度。通俗来说,索引类似于书的目录,根据其中记录的页码可以快速找到所需的内容。——维基百科
常见索引有哪些?

  • 普通索引:最基本的索引,没有任何限制
  • 唯一索引:与”普通索引“类似,不同的就是:索引列的值必须是唯一,但允许有空值
  • 主键索引:它是一种特殊的索引,不允许有空值
  • 全文索引:仅可用于 MyISAM 表,针对较大的数据,生成全文索引很耗时占空间
  • 组合索引:为了提高多条件查询效率,可建立组合索引,遵循"最左前缀匹配原则"

这里以相对复杂的组合为例,介绍如何优化

最左前缀匹配原则

首先我们要知道什么是最左前缀匹配原则。

最左前缀匹配原则是指在使用 B+Tree 联合索引进行数据检索时,Mysql 优化器会读取谓词(过滤条件)并按照联合索引字段创建顺序一直向右匹配直到遇到范围查询或非等值查询后停止匹配,此字段之后的索引列不会被使用,这时计算 key_len 可以分析出联合索引实际使用了哪些索引列。

如何计算 key_len

通过 key_len 计算也帮助我们了解索引的最左前缀匹配原则。

key_len 表示得到结果集所使用的选择索引的长度[字节数],不包括 order by,也就是说如果 order by 也使用了索引则 key_len 不计算在内。

在计算 key_len 之前,先来温习一下基本数据类型(以UTF8 编码为例):

类型 所占空间 不允许为NULL额外占用
char 一个字符三个字节 一个字节
varchar 一个字符三个字节 一个字节
int 四个字节 一个字节
tinyint 一个字节 一个字节

测试数据表如下:


CREATE TABLE `test_table` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `a` int(11) DEFAULT NOT NULL,
 `b` int(11) DEFAULT NOT NULL,
 `c` int(11) DEFAULT NOT NULL,
 PRIMARY KEY (`id`),
 KEY `test_table_a_b_c_index` (`a`,`b`,`c`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

命中索引:


mysql> explain select * from test_table where a = 1 and b = 2 and c = 3;
+----+-------------+------------+------------+------+------------------------+------------------------+---------+-------------------+------+----------+-------------+
| id | select_type | table   | partitions | type | possible_keys     | key          | key_len | ref        | rows | filtered | Extra    |
+----+-------------+------------+------------+------+------------------------+------------------------+---------+-------------------+------+----------+-------------+
| 1 | SIMPLE   | test_table | NULL    | ref | test_table_a_b_c_index | test_table_a_b_c_index | 12   | const,const,const |  1 |  100.00 | Using index |
+----+-------------+------------+------------+------+------------------------+------------------------+---------+-------------------+------+----------+-------------+

可以看到 key_len = 12,这是如何计算的呢?
因为字符集是 UTF8,一个字段占用四个字节,三个字段就是 4 * 3 = 12 字节。

是否允许为 NULL,如果允许为 NULL,则需要用额外的字节来标记该字段,不同的数据类型所需的字节大小不同。


mysql> ALTER TABLE `test_table` CHANGE `a` `a` INT(11) NULL;
mysql> ALTER TABLE `test_table` CHANGE `c` `c` INT(11) NULL;
mysql> ALTER TABLE `test_table` CHANGE `b` `b` INT(11) NULL;
mysql> explain select * from test_table where a = 1 and b = 2 and c = 3;
+----+-------------+------------+------------+------+------------------------+------------------------+---------+-------------------+------+----------+-------------+
| id | select_type | table   | partitions | type | possible_keys     | key          | key_len | ref        | rows | filtered | Extra    |
+----+-------------+------------+------------+------+------------------------+------------------------+---------+-------------------+------+----------+-------------+
| 1 | SIMPLE   | test_table | NULL    | ref | test_table_a_b_c_index | test_table_a_b_c_index | 15   | const,const,const |  1 |  100.00 | Using index |
+----+-------------+------------+------------+------+------------------------+------------------------+---------+-------------------+------+----------+-------------+

可以看到,当字段允许为空时,这时的key_len 变成了15 = 4 3 + 1 3(INT 类型为空时,额外占用一个字节)。

索引优化

有了这些基础知识之后,再来根据实际的SQL 判断索性性能好坏。

还是以上面那张数据表为例,为 a、b、c 三个字段创建联合索引。

SQL 语句 是否索引
explain select * from test_table where a = 1 and b = 2 and c = 3; Extra:Using index key_len: 15
explain select * from test_table where a = 1 and b = 2 and c = 3 order by c; Extra:Using index key_len: 15
explain select * from test_table where b = 2 and c = 3; Extra:Using where; Using index key_len: 15
explain select * from test_table where a = 1 order by c; Extra:Using where; Using index; Using filesort key_len: 5
explain select * from test_table order by a, b, c; Extra:Using index key_len: 15
explain select * from test_table order by a, b, c desc; Extra:Using index; Using filesort key_len:15
explain select * from test_table where a in (1,2) and b in (1,2,3) and c = 1; Extra:Using where; Using index key_len: 15

通常在查看执行计划时, Extra 列为 Using index 则表示优化器使用了覆盖索引。

  • SQL1 可以使用覆盖索引,性能好
  • SQL2 可以使用覆盖索引,同时避免排序,性能好
  • SQL3 可以使用覆盖索引,但是需要根据 where 字句进行过滤
  • SQL4 可以使用部分索引 a,但无法避免排序,性能差
  • SQL5 可以完全使用覆盖索引,同时可以避免排序,性能好
  • SQL6 可以使用覆盖索引,但无法避免排序,(这是因为 MySQL InnoDB 创建索引时默认asc升序,索引无法自动倒序排序)
  • SQL7 可以使用覆盖索引,但是需要根据 where 子句进行过滤(非定值查询)

创建索引规范

  • 考虑到索引维护的成本,单张表的索引数量不超过 5 个,单个索引中的字段数不超过 5 个
  • 不在低基数列上建⽴索引,例如“性别”。 在低基数列上创建的索引查询相比全表扫描不一定有性能优势,特别是当存在回表成本时。
  • 合理创建联合索引,(a,b,c) 相当于 (a) 、(a,b) 、(a,b,c)。 
  • 合理使用覆盖索引减少IO,避免排序。

以上就是Mysql 索引该如何设计与优化的详细内容,更多关于MySQL 索引设计与优化的资料请关注自学编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: Mysql 索引该如何设计与优化

本文链接: https://www.lsjlt.com/news/10213.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Mysql 索引该如何设计与优化
    什么是索引? 数据库索引是一种数据结构,它以额外的写入和存储空间为代价来提高数据库表上数据检索操作的速度。通俗来说,索引类似于书的目录,根据其中记录的页码可以快速找到所需的内容。——维基百科 常见索引有哪些? ...
    99+
    2022-05-28
    MySQL 索引设计 MySQL 索引优化
  • Mysql索引该怎么设计与优化
    小编给大家分享一下Mysql索引该怎么设计与优化,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!什么是索引?数据库索引是一种数据结构,它以额外的写入和存储空间为代价来提高数据库表上数据检索操作的速度。通俗来说,索引类似于书的...
    99+
    2023-06-08
  • MySQL性能优化与索引设计的项目经验总结
    MySQL是一种常用的关系型数据库管理系统,广泛应用于各种Web应用和企业级系统中。在开发和维护MySQL数据库时,性能优化和索引设计是非常关键的环节。本文将基于作者在项目中的经验总结MySQL性能优化和索引设计的一些实践方法和技巧。一、了...
    99+
    2023-11-02
    MySQL性能优化 (Performance Optimization) 索引设计 (Index Design) 项目经
  • 理解MySQL——索引与优化
    写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点。考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录。如果没有索引,查询将对整个表进行...
    99+
    2022-05-13
    mysql
  • MySQL如何优化索引
    1.  MySQL如何使用索引 索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后遍历整个表以找到相关的行。表越大,花费越多。如果表中有相关列的索引,MySQL可以快速确定要在...
    99+
    2022-05-27
    MySQL 索引 MySQL 优化索引
  • Mysql索引如何优化
    小编给大家分享一下Mysql索引如何优化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!编程沉思录     &...
    99+
    2022-10-18
  • PHP学习笔记:数据库优化与索引设计
    在开发Web应用程序时,数据库操作是一个非常关键的环节。数据库的性能直接影响着Web应用程序的响应速度和用户体验。为了提升数据库的效率和查询速度,我们需要进行数据库优化和索引设计。一、数据库优化数据库架构优化:正规化设计:遵循数据库范式,减...
    99+
    2023-10-21
    PHP 数据库优化 索引设计
  • MySQL中如何优化索引
    MySQL中如何优化索引,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。文章的脑图如下:索引优化规则1、like语句的前导模糊查询不能使用索...
    99+
    2022-10-18
  • 浅谈MySQL的B树索引与索引优化小结
    MySQL的MyISAM、InnoDB引擎默认均使用B+树索引(查询时都显示为“BTREE”),本文讨论两个问题: 为什么MySQL等主流数据库选择B+树的索引结构? 如何基于索引结构,理解常见的...
    99+
    2022-10-18
  • Swoole和Workerman对PHP与MySQL的索引统计和索引选择的优化方法
    引言:在Web开发过程中,数据库是必备的组件之一。而索引是对数据库中数据进行快速查找的关键因素之一。索引的选择和优化可以极大地提高数据库的查询性能。在本文中,我们将介绍如何使用Swoole和Workerman对PHP与MySQL的索引进行统...
    99+
    2023-10-21
    swoole 索引优化 Workerman
  • MySQL索引如何进行优化
    这篇文章主要介绍了MySQL索引如何进行优化,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。  创建 test 测试表  CREATE TAB...
    99+
    2022-10-19
  • MySQL中的索引如何优化
    这篇文章主要介绍了MySQL中的索引如何优化的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL中的索引如何优化文章都会有所收获,下面我们一起来看看吧。使用索引优化索引是数...
    99+
    2023-03-01
    mysql
  • PHP与MySQL索引的选择与优化策略
    引言:在开发Web应用程序时,PHP与MySQL是两个重要的技术组合。而索引作为MySQL中重要的特性,对于提高数据库的查询性能至关重要。本文将介绍PHP与MySQL中索引的选择和优化策略,并提供一些具体的代码示例。一、索引的基本原理与分类...
    99+
    2023-10-21
    MySQL PHP 索引优化
  • 深入解析MongoDB的查询优化与索引设计原则
    MongoDB是一种流行的NoSQL数据库,它被广泛应用于许多大规模的Web应用程序和数据驱动的应用程序。在使用MongoDB时,查询优化和索引设计是非常重要的,可以显著提高数据库的性能和响应速度。本文将深入解析MongoDB的查询优化和索...
    99+
    2023-11-02
    MongoDB 查询优化 索引设计
  • mysql中索引配置如何优化
    这篇文章将为大家详细讲解有关mysql中索引配置如何优化,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 2     索引及查询优...
    99+
    2022-10-19
  • MySQL中索引与优化的示例分析
    这篇文章主要介绍MySQL中索引与优化的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!索引与优化1、选择索引的数据类型MySQL支持很多数据类型,选择合适的数据类型存储数据对...
    99+
    2022-10-19
  • MySQL组合索引(多列索引)使用与优化案例详解
    目录1、多列索引2、测试案例及过程2.1 创建一个测试数据库和数据表2.2 添加两个单列索引2.3 查询一条数据利用到两个列的索引2.4 查看执行计划2.5 然后删除以上索引,添加多列索引2.6 再次查询3、多列索引的使...
    99+
    2022-07-04
    mysql组合索引使用 mysql索引
  • 如何通过索引优化PHP与MySQL的多表查询?
    在开发Web应用程序时,经常会涉及到与数据库进行交互的操作,尤其是对于关系型数据库来说,多表查询是非常常见的操作。然而,当数据量过大,查询复杂度增加时,多表查询的性能可能会受到一定的影响。为了提高查询效率,我们可以通过优化索引来进行调整。索...
    99+
    2023-10-21
    MySQL PHP 索引优化 多表查询
  • MySQL | 05 如何设计高性能的索引?
    上回我们主要研究了为什么使用索引,以及索引的数据结构。今天带你了解如何设计高性能的索引。其中,有这么一个点,说的是 InnoDB 引擎中使用的是聚簇索引,其主索引的实现树中的叶子结点存储的是完整的数据记录,...
    99+
    2022-10-18
  • 【MySQL进阶教程】 索引使用与设计原则
    前言 本文为 【MySQL进阶教程】 索引使用与设计原则 相关知识,下边将对索引的使用(包括:验证索引效率,最左前缀法则,范围查询,索引失效情况,SQL提示,覆盖索引,前缀索引,单列索引与联合索引)...
    99+
    2023-09-29
    mysql 数据库 java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作