首页 > 数据库 >mysql 简单进阶 ———— 多列索引[一]

mysql 简单进阶 ———— 多列索引[一]

时间:2023-07-30 12:45:14浏览次数:45  
标签:customer 那么 进阶 索引 mysql 多列 id film

前文

整理一下mysql 的一些简单进阶技巧,来源于高性能mysql,但不是根据书的序列来的。

正文

有一个问题,那就是我们为什么要创建多列索引呢?

这是要思考的一个问题。

为什么创建多列索引,而不是创建多个单列索引。需要弄明白这个问题,那么就需要知道索引是如何工作的。

为什么有索引这个东西呢?

就是因为我们摆放东西是要按照一定的规则去摆放的,为什么要按照规则摆放呢? 就是为了能够快速查找,这个是目的。

为什么建立多个索引,那么就是需要多种规则去摆放,以便于不同的查找方式。

那么多列索引和多个单个索引有什么区别呢? 多列索引是用多个列作为hash去进行排序的,而多个单列是建立多种规则去进行排序。

select film_id, actor_id
from sakila.film_actor
where actor_id = 1 or film_id =1;

举个例子,这个是建立多列索引号还是建立单个索引好?

不用猜想,做下实验。

那么现在建立了两个索引,那么看下运行是怎么样的。

这里可以看到,实际上是用到了两个索引,然后进行合并。

那么这里建立多个列索引有什么影响呢?

这里加了一个多列索引。

这里最后多列索引没有用,还是用的是两个单的索引。

原因是因为or,这个如果是两个列的hash作为结构的参考的话,那么实际上意义不大。

第一点现在已经理解了,那么第二点呢? 多个索引做联合操作时候,相当于做了两个查询,并且扫描了两次。

首先我们要知道这个扫描的29行是怎么来的。

是通过不同的索引扫描来的,10+19=29.

那么这里如果只创建一个索引怎么样?

看下分析结果:

几乎和前面没有变化。

原因为:

这张表有联合索引,查找actor_id 直接用了primary,也就是一个多列索引。

然后查找film_id 用了idx_fk_film_id 这个作为索引。

索引另外建立的索引都是多余的。

那么现在知道了一些多列索引和单列索引的区别了。

那么该如何选择多列索引呢?

在一个多列的b-tree 索引中,索引列的顺序意味着索引先按照最左进行排序,其次是第二列,这个可以看下我的c# linq系列。

索引可以按照升序或者降序进行扫描,以满足精确符合列顺序的order by,group by 和 distinct 等语句、

那么我们就会想到一个问题,那就是先把过滤多的放在第一列,这样使用where 的话,那么过滤的最多了。

但是依然需要考虑到group by 和 order by的情况。

先举个适用的例子:

select * from payment where staff_id = 2 and customer_id=584

如果这个语句很慢,那么我们考虑给他建立索引,那么哪个在前哪个在后呢?

显然我们应该选择customer_id,因为这个更少。

第一次过滤就可以过滤剩下30.

如果建立customer_id 索引,那么只需要过滤30里面的17即可。

但是上面有一个小小的问题,那就是我们指定了staff_id = 2 and customer_id=584 优化性能是最好的,但是会不会这个是特殊的。

那么就需要考虑整体性:

和前面的结果意义,customer_id 选择性高,因为 distinct 后的数量更多,也就基本意味着customer_id 筛选出来的条件更少。

所以你可以创建索引 alter table payment add key(customer_id,staff_id )

这里是个例子哈,也不是有and 就建立两个索引,这里customer_id 过滤出来的staff_id 都是30,其实建立customer_id索引就行。

那么还有一个问题,那就是是不是这个就通用了呢?

举一个反例:

下一节查询优化

标签:customer,那么,进阶,索引,mysql,多列,id,film
From: https://www.cnblogs.com/aoximin/p/17583057.html

相关文章

  • C++ 算法进阶系列之再聊聊动态规划的两把刷子
    1.前言递归和动态规划是算法界的两个扛把子,想进入算法之门,则必须理解、掌握这两种算法的本质。一旦参悟透这2种算法的精髓,再加上对树、图等复杂数据结构的深入理解,可以解决大部分的算法问题。本文通过几个典型案例,再次聊聊动态规划算法。其实动态规划算法也就2把刷子。找到......
  • Mysql数据库中数据量特别大,读取特别慢,已经做了索引,怎么优化
    当MySQL数据库中的数据量特别大,读取操作变得特别慢,即使已经添加了索引,仍然需要进一步优化。下面是一些建议以及示例代码来优化这种情况:使用合适的索引:确保为频繁查询的列添加了合适的索引。可以使用EXPLAIN语句来分析查询的执行计划,检查是否正确使用了索引。示例代码:sqlCopycodeE......
  • 雀魂07 进阶技巧
    在无人被飞的情况下,东场每个人一个庄位,而南场每个人是两个庄。东场运气>技术,南场正好相反 制定振听规则的意义在于防守判断与减少见逃行为的发生。所以,在出牌的后期,要如果自己的牌处于听的状态,但是为了防止其他人优势和。可以放弃和牌,进行防守。出牌的时候,参考别人打出过的牌,......
  • MySQL学习-DML(Data Manipulation Language)数据--select语句02
    表连接:分为内连接和外连接,常用内连接。当需要同时显示多个表中字段时,就可以用表连接。内连接:仅选出两张表中互相匹配的记录外连接:还会选出其他不匹配的记录外连接包含左连接和右连接左连接: ......
  • 6、Mysql创建用户以及授权
    文件夹就是数据库文件就是表数据行就是行 data下的mysql这个数据库里有张User表,里面保存了用户信息 showdatabases;查看所有数据库 usemysql;使用这个use数据库(进入这个文件夹) showtables;查看这个数据库下所有的表(文件)文件最后有个user,我们登陆mysql服务器......
  • 【webpack系列】从基础配置到掌握进阶用法
    前言本篇文章将介绍一些webpack的进阶用法,演示内容继承自上一篇文章的内容,所以没看过上一篇文章的建议先学习上一篇内容再阅读此篇内容,会更有利于此篇的学习~文件指纹文件指纹指的是打包输出的文件名后缀,一般用来做版本管理、缓存等webpack的指纹策略有三种:hash、chunkhash、content......
  • PYTHON mysql形成分割文件
    importrandom,string,re,time,sys,hashlib,pymysql,requestsf=open("aa.txt","w")connect=pymysql.connect(user='root',password='123456',db='new',host......
  • 【MySQL技术专题】「实战开发系列」一同探索一下数据库的加解密函数开发实战指南之AES
    MySQL的加解密及压缩函数许多加密和压缩函数返回结果可能包含任意字节值的字符串。如果要存储这些结果,请使用具有VARBINARY或BLOB二进制字符串数据类型的列。这避免了删除尾随空格或转换字符集可能改变数据值的潜在问题,例如使用非二进制字符串数据类型(CHAR、VARCHAR、TEXT)时可能发......
  • MySQL慢查询解析
    文档课题:MySQL慢查询解析.数据库:mysql5.7.211、建测试表1.1、建表结构.mysql>usebooksDB;ReadingtableinformationforcompletionoftableandcolumnnamesYoucanturnoffthisfeaturetogetaquickerstartupwith-ADatabasechangedCREATETABLE`t_user......
  • MYSQL的安全模式:sql_safe_updates介绍
    查看当前mysqlsession会话下的sql_safe_updatesselect@@sql_safe_updates;查看全局的配置参数sql_safe_updatesselect@@global.sql_safe_updates set[global]sql_safe_updates=1; 在update操作中:当where条件中列(column)没有索引可用且无limit限制时会拒绝更新。whe......