首页 > 数据库 >Mysql索引相关的知识复盘一

Mysql索引相关的知识复盘一

时间:2023-02-02 10:33:55浏览次数:41  
标签:orderinfo item price 复盘 索引 Mysql 数据 id


索引的作用和分类

索引的优缺点

优点:

  • 加快数据检索速率
  • 排序分组时候,使用索引将降低资源的消耗

缺点:

  • 增加了索引维护的成本
  • 降低了更新的速度
  • 提高了数据维护的成本
  • 索引会占据更多的磁盘的空间

索引的一般分类

从 功能逻辑上说,索引主要有4种,分别是普通索引、唯一索引、主键索引、全文索引。 按照 物理实现方式 ,索引可以分为2种:聚簇索引和非聚簇索引。 按照 作用字段个数 进行划分,分成单列索引和联合索引 索引的分类如下:

  1. 普通索引
  2. 唯一性索引
  3. 主键索引
  4. 单列索引
  5. 多列(组合、联合)索引
  6. 全文索引
  7. 空间索引

索引创建规范

​CREATE TABLE table_name [col_name data_type] [UNIQUE | FULLTEXT | SPATIAL] [INDEX | KEY] [index_name] (col_name [length]) [ASC | DESC]​

  • UNIQUE 、 FULLTEXT 和 SPATIAL 为可选参数,分别表示唯一索引、全文索引和空间索引;
  • INDEX 与 KEY 为同义词,两者的作用相同,用来指定创建索引;
  • index_name 指定索引的名称,为可选参数,如果不指定,那么MySQL默认col_name为索引名;
  • col_name 为需要创建索引的字段列,该列必须从数据表中定义的多个列中选择;
  • length 为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度;
  • ASC 或 DESC 指定升序或者降序的索引值存储

索引的数据结构和IO流程

Mysql的索引使用B+树结构,树的节点不止保存了主键数据还保存了其他字段,好处在于可以减少IO操作,也导致了索引占用了大量的磁盘空间,增加了索引的维护的难度

Mysql索引相关的知识复盘一_数据库

索引的IO操作流程

仍以下图为例(record_type :记录头信息的一项属性,表示记录的类型, 0 表示普通记录、 2 表示最小记录、3 表示最大记录)

Mysql索引相关的知识复盘一_数据_02

数据的新增操作

前面可以看到页的数据已经满了,如果需要插入新的数据,需要重新生成新的一页,如下,不仅需要生成新的页32,还需要生成新的页31保存数据(因为页32是作为目录项存在的)

Mysql索引相关的知识复盘一_字段_03

索引的数据的查找

以查找主键值为5的数据为例 一 确认目录项

索引会按照目录,通过的目录保存的最大和最小的主键值,确认所在目录在页30

二 根据目录的记录查找

目录保存了每个页的数据的最小值,通过最小值可以确定数据在页28

三 在页内查找

在页28内查找数据,可获得主键值为5的全部数据

页分裂的操作

Mysql的索引数据是按页(聚簇索引)的存储,索引不仅保存了用户的数据,而且维护索引结构,保证新的页数据的主键索引比前面的大,当发现不满足条件时候,会触发分页操作,调整数据分布,为了提高数据的插入速度,也为了降低数据的维护成本,建议每次插入时候,保持主键的递增

Mysql索引相关的知识复盘一_java_04

Mysql索引相关的知识复盘一_java_05

聚簇索引和非聚簇索引的区别

聚簇索引在叶子节点保存了数据,而非聚簇索引只保存主键值和完整数据的物理地址,当非聚簇索引需要使用非主键字段时候,在查找一次非聚簇索引的数据后,按照其获得的物理地址,在对应的数据也查找,获得全部的字段,这就是回表

索引的设计准则

索引适合的场景

  1. 索引的字段具有唯一性
  2. 需要频繁过过滤的字段
  3. 需要频繁分组排序的字段
  4. 表连接的字段需要建立索引
  5. 有条件的更新操作
  6. 需要去重的字段

建议:索引的字段需要具有散列性,重复度太高的字段,没必要做索引,若使用前缀索引,需要截取字段的时候,可以使用参考规则

如一下建表语法

​create table shop(address varchar(120) not null);​​ 使用类似的语法,使用选择度较高,字段较少的字段,建立索引,

Mysql索引相关的知识复盘一_mysql_06

索引的不适合的场景

  1. 数据重复多
  2. 数据量小
  3. 经常药更新的字段
  4. 字段无序
  5. 索引冗余的字段

索引的性能测试

使用orderinfo表,数据大小为1110368条数据,建表语句如下:

​CREATE TABLE​​​ orderinfo​​(​​ user_id` bigint DEFAULT NULL,

​order_id​​ bigint NOT NULL,

​item_id​​ bigint DEFAULT NULL,

​flag​​ bigint DEFAULT NULL,

​times​​ bigint DEFAULT NULL,

​price​​ float DEFAULT NULL,

​num​​ int DEFAULT NULL,

PRIMARY KEY (​​order_id​​) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;`

分组测试

​select item_id,count(*) from orderinfo group by item_id​​ 无索引为0.63秒

有索引为0.41秒

去重测试

​select distinct(user_id) from orderinfo​

有索引 0.47s 无索引 0.56s

排序测试

​select distinct item_id from orderinfo order by item_id desc limit 10;​

有索引 0.01s

无索引 0.56s

复杂的聚合排序

​select item_id,sum(price) as price from orderinfo where flag=4 group by item_id order by price desc limit 100;​

无索引 2.58s

有索引 2.57s 没有优势

主要是使用order by语句需要进行filesort文件排序和临时表保存数据,时间延长了

explain

explain语句可以用来分析sql语句的执行状态以以下语句为例:

​explain select item_id,sum(price) as price from orderinfo where flag=4 group by item_id order by price desc limit 100;​

执行结果如以下所示:

Mysql索引相关的知识复盘一_java_07

​​详细的可以参考,explain的详细语法介绍​

Mysql8索引新特性

索引隐藏

mysql8引入了不可见索引,用于验证删除索引后,对sql查询的影响,语法如下

​alter table tablename alter index indexname invisible/visible;​

索引函数化

索引函数就是字段加了函数的索引,这里的函数也可以是表达式。所以也叫表达式索引 例子如下:

​create index price_function_index on orderinfo((from_unixtime(times,'%Y-%m-%d')))​

Mysql索引相关的知识复盘一_数据库_08


标签:orderinfo,item,price,复盘,索引,Mysql,数据,id
From: https://blog.51cto.com/u_15063934/6033055

相关文章

  • mysql命令
    一、权限1.授权grant[权限]on[库.表]to[用户名]@[IP]例:grantSYSTEM_VARIABLES_ADMINon*.*to'opsdev'@'%'2.刷新权限flushprivile......
  • Mysql的锁机制
    Mysql的锁机制是除了Mysql的MVCC机制外,解决并发过程的幻读等问题的另外的方案,当然性能比mvcc机制较低,因为不允许读写操作并列执行,但是一些特殊机制,必须使用Mysql的锁方案锁......
  • mysqldump 与 mysqlpump
    简介:mysqldump与mysqlpump都是mysql自带的备份工具。mysqlpump是mysqldump的一个衍生,本身也参考了mydumper的思路,支持了并行导出数据,因此导出数据的效率比mysqldu......
  • Mysql远程连接
    阿里云系统ubuntu16.041.将/etc/mysql/mysql.conf.d/mysqld.cnf中的bind-address注释掉2.进入mysql,输入命令GRANTALLPRIVILEGESON.TO'root'@'%'IDENTIFIEDBY......
  • mysql删库勒索
    看到黑客派里有人遇到了这事,我虽然还没遇到过,还是预防一下比较好1.数据库备份通过写脚本来达成每天备份数据库的习惯2.防止root用户的公网访问,使用SSH的连接方式3.......
  • 63linux安装and卸载mysql
    配置腾讯云+centos7卸载mysql1.rpm-qa|grep-imysql2.rpm-e--nodeps上面查询的结果(全部要删除)安装MySQL8以下版本1.在root目录下,安装mysql和m......
  • Qt模型视图结构3_模型索引与模型的常用函数
    目录前言模型索引相关函数模型索引与模型访问和修改数据项的方法前言在数据项、模型以及视图三者之间,模型索引扮演着至关重要的角色。因此在此将模型索引的函数列举一下......
  • Python连接MySQL数据库
    Python连接MySQL数据库安装MySQL参考链接安装NavicatPremium16参考链接连接MySQL安装库pipinstallpymysqlMySQL封装#!/usr/bin/envpython#-*-coding:ut......
  • mysql字符串函数 lpad() : 补‘0’没有显示,补‘1’显示的情况
    更新时使用lpad():补‘0’没有显示,补‘1’显示的,发生这种情况的原因可能是在使用lpad()函数时,第一个参数的字段类型不是字符类型,例如是int类型的字段,那么填充'0'是不会生......
  • 查询达梦数据库所有表的各种约束和索引
    查询DM数据库所有表的各种约束和索引--查询主键SELECTa.OWNERas"模式名",a.TABLE_NAMEas"表名",b.COLUMN_NAMEas"列名",a.CONSTRAINT_NAMEas"约束名"fromDBA......