21 天 Python 计划:MySQL索引机制从基础到应用

文章目录

    • 一、引言
    • 二、MySQL索引机制概述
      • [2.1 MySQL索引的创建方式](#2.1 MySQL索引的创建方式)
      • [2.2 查询、删除、指定索引](#2.2 查询、删除、指定索引)
      • [2.3 数据库索引的本质](#2.3 数据库索引的本质)
    • 三、MySQL的索引分类
      • [3.1 数据结构层次](#3.1 数据结构层次)
      • [3.2 字段数量层次](#3.2 字段数量层次)
      • [3.3 功能逻辑层次](#3.3 功能逻辑层次)
      • [3.4 存储方式层次](#3.4 存储方式层次)
      • [3.5 索引分类小结](#3.5 索引分类小结)
    • 四、MySQL其他索引的创建使用方式
      • [4.1 唯一索引的创建与使用](#4.1 唯一索引的创建与使用)
      • [4.2 主键索引的创建与使用](#4.2 主键索引的创建与使用)
      • [4.3 全文索引的创建与使用](#4.3 全文索引的创建与使用)
      • [4.4 空间索引的创建与使用](#4.4 空间索引的创建与使用)
      • [4.5 联合索引的创建与使用](#4.5 联合索引的创建与使用)
    • 五、总结

Python是一种强大且易于学习的编程语言。通过这个21天的计划,我们将逐步深入MySQL索引机制从基础到应用。无论你是初学者还是有一定基础的开发者,这个计划都将帮助你巩固和扩展你的Python知识。
在学习本篇之前,我们先复习一下前面的内容:
day1:Python下载和开发工具介绍
day2:数据类型、字符编码、文件处理
day3:基础语法与课外练习
day4:函数简单介绍
day5:模块与包
day6:常用模块介绍
day7:面向对象
day8:面向对象高级
day9:异常处理
day10:网络编程
day11:并发编程
day12:MySQL数据库初识
day13:MySQL库相关操作
day14:MySQL表相关操作
day15:MySQL中DML与权限管理
day16:MySQL数据备份与Python操作实战指南
day17:MySQL视图、触发器、存储过程、函数与流程控制
day18:使用SQLAlchemy 中的ORM查询

一、引言

在业务系统中,MySQL作为存储层部署在最后端,所有业务数据最终都要入库落盘。随着项目在线上运行时间增长,数据库的数据量会不断增多,表查询效率也会越发低下。因为MySQL默认的查询方式是全表扫描,会触发大量磁盘IO。

例如,在一个有七位学生信息的zz_student表中,查询姓名为「脑斧」的学生信息,至少要经过六次磁盘IO才能检索到目标。若表中有1000W条数据,要查的目标数据位于表的900W行以后,那效率可想而知。

而查询是业务系统中最频繁的操作,一般项目的写/读请求比例遵循三七定律,所以提升数据库的查询性能至关重要。这就如同小时候查新华字典,通过目录索引能快速找到目标汉字,MySQL也提供了索引机制来提升查询效率。

既然字典中都存在目录索引页,能帮助小时候的我们快速检索汉字,那这个思想能否应用到数据库中来呢?答案是当然可以,并且MySQL也提供了索引机制,索引是数据库中的核心组件之一,一张表中建立了合适的索引后,往往在面对海量数据查询时,能够事半功倍,接下来一起探讨一下MySQL的索引。

二、MySQL索引机制概述

2.1 MySQL索引的创建方式

  • 使用CREATE语句创建
sql 复制代码
CREATE INDEX indexName ON tableName (columnName(length) [ASC|DESC]);

此方式可给已存在的表结构添加索引,需指定索引名、表名、字段名等。INDEX也可更改为KEY,用于创建普通索引。

  • 使用ALTER语句创建
sql 复制代码
ALTER TABLE tableName ADD INDEX indexName(columnName(length) [ASC|DESC]);

参数与CREATE语句类似。

  • 建表时DDL语句中创建
sql 复制代码
CREATE TABLE tableName(
    columnName1 INT(8) NOT NULL,
    columnName2 ....,
    .....,
    INDEX [indexName] (columnName(length))
);

适合在库表设计时确定索引项的情况。

2.2 查询、删除、指定索引

  • 查询索引 :使用SHOW INDEX FROM tableName;命令可查询表中拥有的索引。查询结果各字段含义如下:
    • Table:当前索引所属表。
    • Non_unique:是否为唯一索引,0是,1不是。
    • Key_name:索引名字。
    • Seq_in_index:联合索引中字段的排序。
    • Column_name:索引所在字段。
    • Collation:字段值在索引中的存储方式,A表示有序,NULL表示无序。
    • Cardinality:索引的散列程度。
    • Sub_part:索引使用字段值的字符数,NULL表示全部。
    • Packed:索引存储字段值的压缩方式,NULL表示未压缩。
    • Null:索引字段值中是否存在NULL值。
    • Index_type:索引的结构。
    • Comment:索引的备注信息。
  • 删除索引:使用DROP INDEX indexName ON tableName;语句删除索引。
  • 指定索引:使用SELECT * FROM table_name FORCE INDEX(index_name) WHERE ...;为查询语句强制指定索引,但需注意查询SQL要能走指定的索引字段。

2.3 数据库索引的本质

数据库基于磁盘工作,索引也是数据的一种,最终会在磁盘生成本地文件。索引文件的存储方式由索引的数据结构决定,不同存储引擎下的索引文件格式也不同。建立索引时,表数据越少越好,因为创建索引需要基于原表数据在磁盘创建新的本地索引文件,数据量越大,创建耗时越长。

三、MySQL的索引分类

3.1 数据结构层次

MySQL索引支持的数据结构有:

  • B+Tree类型:最常用,大部分引擎支持,有序。
  • Hash类型:大部分存储引擎支持,字段值不重复时查询最快,无序。
  • R-Tree类型:MyISAM引擎支持,是空间索引的默认结构类型。
  • T-Tree类型:NDB - Cluster引擎支持,用于MySQL - Cluster服务。

创建索引时,默认数据结构为B+Tree,可通过USING关键字指定其他支持的结构。索引分为有序和无序,由数据结构决定。

3.2 字段数量层次

  • 单列索引:基于一个字段建立的索引,包括唯一索引、主键索引、普通索引等。
  • 多列索引:由多个字段组合建立的索引,也叫组合索引、联合索引等。使用多列索引时,查询条件需包含第一个字段才能使用。

此外,还有前缀索引,即使用字段值的前N个字符创建的索引,可节省存储空间并提升性能。

3.3 功能逻辑层次

从功能逻辑划分,索引主要分为普通索引、唯一索引、主键索引、全文索引、空间索引。

  • 全文索引:类似于ES、Solr搜索中间件中的分词器,只能创建在文本类型字段上,查询条件字符数量必须大于3才生效。创建时需使用FULLTEXT关键字,5.6版本的MySQL中,存储引擎必须为MyISAM才能创建,若要支持中文,需指定解析器with parser ngram。

  • 空间索引:基于GIS空间数据,用于管理地理信息的数据结构,在地理相关项目中应用较多。MySQL支持GEOMETRY、POINT、LINESTRING、POLYGON四种空间数据类型,空间索引基于这些类型的字段建立。

3.4 存储方式层次

  • 聚簇索引:逻辑和物理空间上都连续,索引数据和表数据在磁盘中的位置在一起。一张表只能有一个聚簇索引,一般选用主键作为聚簇索引。
  • 非聚簇索引:逻辑上连续,物理空间上不连续,索引节点和表数据通过物理地址维护联系。

3.5 索引分类小结

MySQL的索引从不同角度有多种分类方式,以功能逻辑层次划分是最常用的方式。通过对不同层次索引的了解,能更系统地认识MySQL的索引机制。

四、MySQL其他索引的创建使用方式

4.1 唯一索引的创建与使用

使用UNIQUE关键字创建唯一索引,若表中字段值存在相同值,则无法创建。创建成功后,对表具备唯一约束作用,插入相同值会报错。

sql 复制代码
-- 方式①
CREATE UNIQUE INDEX indexName ON tableName (columnName(length));
-- 方式②
ALTER TABLE tableName ADD UNIQUE INDEX indexName(columnName);
-- 方式③
CREATE TABLE tableName(
    columnName1 INT(8) NOT NULL,
    columnName2 ....,
    .....,
    UNIQUE INDEX [indexName] (columnName(length))
);

4.2 主键索引的创建与使用

使用PRIMARY关键字创建主键索引,创建时必须将索引字段先设为主键,不能使用CREATE语句创建,关键字要换成KEY。一般主键索引在建表的DDL语句中创建。

sql 复制代码
-- 方式①
ALTER TABLE tableName ADD PRIMARY KEY indexName(columnName);
-- 方式②
CREATE TABLE tableName(
    columnName1 INT(8) NOT NULL,
    columnName2 ....,
    .....,
    PRIMARY KEY [indexName] (columnName(length))
);

4.3 全文索引的创建与使用

创建全文索引需使用FULLTEXT关键字,有版本和字段类型等限制。使用时需了解最小搜索长度和最大搜索长度的概念,有自然语言模式、布尔搜索模式、查询拓展搜索三种搜索模式。

sql 复制代码
-- 方式①
ALTER TABLE tableName ADD FULLTEXT INDEX indexName(columnName);
-- 方式②
CREATE FULLTEXT INDEX indexName ON tableName(columnName);

4.4 空间索引的创建与使用

使用SPATIAL关键字创建空间索引,目前仅MyISAM引擎支持,且必须建立在特定的空间数据类型字段上。

sql 复制代码
ALTER TABLE tableName ADD SPATIAL KEY indexName(columnName);

4.5 联合索引的创建与使用

使用多个字段建立联合索引,可使用INDEX、UNIQUE INDEX、FULLTEXT INDEX等关键字。查询条件需包含第一个字段才能触发联合索引。

sql 复制代码
CREATE INDEX indexName ON tableName (column1(length),column2...);
ALTER TABLE tableName ADD INDEX indexName(column1(length),column2...);

五、总结

通过这个21天的Python计划,我们涵盖了MySQL索引机制从基础到应用。希望这些内容能帮助你更好地理解和使用Python。继续学习和实践,你将成为一名优秀的Python开发者!

相关推荐
lilye662 分钟前
程序化广告行业(81/89):行业术语解析与日常交流词汇指南
mysql·flink·kafka
脱脱克克10 分钟前
Python中的占位符pass用法
python
哪吒编程15 分钟前
突破亚马逊壁垒,Web Unlocker API 助您轻松获取数据
后端·python
这里有鱼汤1 小时前
Python中的时间与日期处理:那些你可能不知道的小技巧
后端·python
这里有鱼汤1 小时前
用 Python 的 playwright 库 爬取 Pexels 网站的图片
前端·后端·python
databook1 小时前
『Plotly实战指南』--雷达图绘制与应用
python·数据分析·数据可视化
搞不懂语言的程序员1 小时前
迭代器模式深度解析与实战案例
开发语言·python·迭代器模式
墨染丶eye1 小时前
jupyter异常及解决办法记录
python
SRC_BLUE_171 小时前
Python GUI 编程 | QAbstractButton 抽象按钮类详解 — 按钮状态设置
开发语言·python
itwangyang5201 小时前
AIDD-人工智能药物-pyecharts-gallery
人工智能·python·语言模型·自然语言处理