数据库-索引

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 类似于一本书中的目录,起到优化查询的作用

索引

  1. 索引的作用

    类似于一本书中的目录,起到优化查询的作用

  2. 索引的分类(算法)

    B树 默认使用的索引类型

    R树

    Hash

    FullText

    GIS 索引

  3. Btree索引功能上的分类

    1. 辅助索引

      • 提取索引列的所有值,进行排序
      • 将排好序的值,均匀的存放在叶子节点,进一步生成枝节点和根节点
      • 在叶子节点中的值,都会对应存储主键ID
    2. 聚集索引

      • MySQL 会自动选择主键作为聚集索引列,没有主键会选择唯一键,如果都没有会生成隐藏的
      • MySQL进行存储数据时,会按照聚集索引列值得顺序,有序存储数据行
      • 聚集索引直接将原表数据页,作为叶子节点,然后提取聚集索引列向上生成枝和根
    3. 聚集索引和辅助索引的区别

      • 表中任何一个列都可以创建辅助索引,在你有需要的时候,只要名字不同即可
      • 在一张表中,聚集索引只能有一个,一般是主键.
      • 辅助索引,叶子节点只存储索引列的有序值+聚集索引列值.
      • 聚集索引,叶子节点存储的时有序的整行数据.
      • MySQL 的表数据存储是聚集索引组织表
  4. 辅助索引细分

    1. 单列辅助索引
    2. 联合索引(覆盖索引)
    3. 唯一索引
  5. 索引树高度

    索引树高度应当越低越好,一般维持在3-4最佳

    1. 数据行数较多

      分表 : parttion 用的比较少了;分片,分布式架构

    2. 字段长度

      业务允许,尽量选择字符长度短的列作为索引列

      业务不允许,采用前缀索引.

    3. 数据类型

      char 和 varchar

      enum

  6. 索引的命令操作

    1. 查询索引

      desc city;

      PRI ==> 主键索引

      MUL ==> 辅助索引

      UNI ==> 唯一索引

      mysql> show index from city\G

    2. 创建索引

      • 单列的辅助索引

        mysql> alter table city add index idx_name(name);
      • 多列的联合索引

        mysql> alter table city add index idx_c_p(countrycode,population);
      • 唯一索引:

        mysql> alter table city add unique index uidx_dis(district);
        
        mysql> select count(district) from city;
        mysql> select count(distinct district) from city;
      • 前缀索引

        mysql> alter table city add index idx_dis(district(5));
    3. 删除索引

      mysql> alter table city drop index idx_name;
      mysql> alter table city drop index idx_c_p;
      mysql> alter table city drop index idx_dis;
  7. 压力测试

    1. 准备

      mysql> use test
      mysql> source /tmp/t100w.sql
    2. 未做优化之前测试

      mysqlslap --defaults-file=/etc/my.cnf \
      --concurrency=100 --iterations=1 --create-schema='test' \
      --query="select * from test.t100w where k2='MN89'" engine=innodb \
      --number-of-queries=2000 -uroot -p123 -verbose
    3. 索引优化后

      mysqlslap --defaults-file=/etc/my.cnf --concurrency=100 --iterations=1 --create-schema='test' --query="select * from test.t100w where k2='MN89'" engine=innodb --number-of-queries=2000 -uroot -p123 -verbose

执行计划分析

  1. 作用

    将优化器 选择后的执行计划 截取出来.便于管理管判断语句得执行效率

  2. 获取执行

    desc SQL语句
    explain SQL 语句

    mysql> desc select * from test.t100w where k2='MN89';
  3. 分析执行计划

    • table
    • type

      查询类型

      • 全表扫描 ALL
      • 索引扫描 index,range,ref,eq_ref,const(system),NULL

    index: 全索引扫描

    mysql> desc select countrycode  from city;

    range: 索引范围扫描(> < >= <= , between and ,or,in,like )

    mysql> desc select * from city where id>2000;
    mysql> desc select  * from city where countrycode like 'CH%';

    对于辅助索引来讲,!= 和not in等语句是不走索引的

    对于主键索引列来讲,!= 和not in等语句是走rang


mysql> desc select  * from city where countrycode='CHN' or countrycode='USA';
mysql> desc select  * from city where countrycode in ('CHN','USA');
 
 改写
 
 ```sql
 desc 
 select  * from city where countrycode='CHN' 
 union all 
 select  * from city where countrycode='USA';
 ```


 **ref: 辅助索引等值查询**
 
 ```sql
 desc 
 select  * from city where countrycode='CHN' 
 union all 
 select  * from city where countrycode='USA';
 ```


 **eq_ref : 多表连接时,子表使用主键列或唯一列作为连接条件**
 
 A join B 
 
 on a.x = B.y 
 
 ```sql
 desc select b.name,a.name ,a.population  
 from city as a 
 join country as b 
 on a.countrycode=b.code sql
 where a.population<100;
 ```


 **const(system) : 主键或者唯一键的等值查询**
 
 ```sql
 mysql> desc select * from  city where id=100;
 ```



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
27天前
|
数据库 索引
深入探索数据库索引技术:回表与索引下推解析
【10月更文挑战第15天】在数据库查询优化的领域中,回表和索引下推是两个核心概念,它们对于提高查询性能至关重要。本文将详细解释这两个术语,并探讨它们在数据库操作中的作用和影响。
46 3
|
27天前
|
数据库 索引
深入理解数据库索引技术:回表与索引下推详解
【10月更文挑战第23天】 在数据库查询性能优化中,索引的使用是提升查询效率的关键。然而,并非所有的索引都能直接加速查询。本文将深入探讨两个重要的数据库索引技术:回表和索引下推,解释它们的概念、工作原理以及对性能的影响。
48 3
|
12天前
|
数据库 索引
数据库索引
数据库索引 1、索引:建立在表一列或多列的辅助对象,目的是加快访问表的数据。 2、索引的优点: (1)、创建唯一性索引,可以确保数据的唯一性; (2)、大大加快数据检索速度; (3)、加速表与表之间的连接; (4)、在查询过程中,使用优化隐藏器,提高系统性能。 3、索引的缺点: (1)、创建和维护索引需要耗费时间,随数据量增加而增加; (2)、索引占用物理空间; (3)、对表的数据进行增删改时,索引需要动态维护,降低了数据的维护速度。
28 2
|
1月前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
64 3
Mysql(4)—数据库索引
|
23天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
116 1
|
17天前
|
存储 关系型数据库 数据库
Postgres数据库BRIN索引介绍
BRIN索引是PostgreSQL提供的一种高效、轻量级的索引类型,特别适用于大规模、顺序数据的范围查询。通过存储数据块的摘要信息,BRIN索引在降低存储和维护成本的同时,提供了良好的查询性能。然而,其适用场景有限,不适合随机数据分布或频繁更新的场景。在选择索引类型时,需根据数据特性和查询需求进行权衡。希望本文对你理解和使用PostgreSQL的BRIN索引有所帮助。
27 0
|
24天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
53 0
|
1月前
|
关系型数据库 MySQL 数据库
深入浅出MySQL索引优化:提升数据库性能的关键
在这个数据驱动的时代,数据库性能的优劣直接关系到应用的响应速度和用户体验。MySQL作为广泛使用的数据库之一,其索引优化是提升查询性能的关键。本文将带你一探MySQL索引的内部机制,分析索引的类型及其适用场景,并通过实际案例演示如何诊断和优化索引,以实现数据库性能的飞跃。
|
1月前
|
存储 SQL 数据库
深入理解数据库索引:提升查询性能的关键
数据库索引是优化查询性能的重要工具。本文将带你深入探索索引的内部结构和工作原理,揭示如何通过合理使用索引来加速数据库查询,同时避免常见的索引陷阱。
|
2月前
|
监控 关系型数据库 MySQL
如何优化MySQL数据库的索引以提升性能?
如何优化MySQL数据库的索引以提升性能?
123 0
下一篇
无影云桌面