前文

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

正文

库地址:

https://dev.mysql.com/doc/index-other.html

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

这是要思考的一个问题。

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

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

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

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

那么多列索引和多个单个索引有什么区别呢? 多列索引是用多个列作为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索引就行。

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

举一个反例:

下一节查询优化

mysql 简单进阶 ———— 多列索引[一]的更多相关文章

  1. MySQL Index--关联条件列索引缺失导致执行计划性能不佳

    某系统反馈慢SQL影响生产,查看SLOW LOG发现下面慢SQL: SELECT COUNT(DISTINCT m.batch_no) FROM ob_relation r INNER JOIN ob ...

  2. mysql之多列索引

    mysql的多列索引是经常会遇到的问题,怎样才能有效命中索引,是本文要探讨的重点. 多列索引使用的Btree,也就是平衡二叉树.简单来说就是排好序的快速索引方式.它的原则就是要遵循左前缀索引. 多个索 ...

  3. mysql索引之一:索引基础(B-Tree索引、哈希索引、聚簇索引、全文(Full-text)索引区别)(唯一索引、最左前缀索引、前缀索引、多列索引)

    没有索引时mysql是如何查询到数据的 索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储10 ...

  4. Mysql的列索引和多列索引(联合索引)

    转自:http://blog.chinaunix.net/uid-29305839-id-4257512.html 创建一个多列索引:CREATE TABLE test (      id       ...

  5. 正确理解Mysql的列索引和多列索引

    MySQL数据库提供两种类型的索引,如果没正确设置,索引的利用效率会大打折扣却完全不知问题出在这. CREATE TABLE test ( id         INT NOT NULL, last_ ...

  6. mysql 多列索引的生效规则

    mysql中 myisam,innodb默认使用的是 Btree索引,至于btree的数据结构是怎样的都不重要,只需要知道结果,既然是索引那这个数据结构最后是排好序:就像新华字典他的目录就是按照a,b ...

  7. mysql 开发进阶篇系列 3 SQL 优化(索引使用方法)

    一. 本章介绍mysql中的索引的分类,存储,使用方法的介绍 1.  索引的存储分类 MyISAM存储引擎的表的数据和索引是自动分开存储的,各自是独立的一个文件, innodb 存储引擎的表的数据和索 ...

  8. MySQL InnoDB引擎B+树索引简单整理说明

    本文出处:http://www.cnblogs.com/wy123/p/7211742.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...

  9. mysql多列索引和最左前缀

    数据库的索引可以加快查询速度,原因是索引使用特定的数据结构(B-Tree)对特定的列额外组织存放,加快存储引擎(索引是存储引擎实现)查找记录的速度.索引优化是数据库优化的最重要手段. 如果查询语句使用 ...

  10. mysql多列索引优化

    “把Where条件里面的列都建上索引”,这种说法其实是非常错误的! 这样一个查询,假设actor_id与film_id都单独建立索引 SELECT film_id , actor_id FROM sa ...

随机推荐

  1. RocketMQ(10) 消息类型

    一.普通消息 1. 消息发送方式分类 Producer对于消息的发送方式也有多种选择,不同的方式会产生不同的系统效果. 同步发送消息: 同步发送消息是指,Producer发出⼀条消息后,会在收到MQ返 ...

  2. java中StringBuffer与 StringBuilder 类

    目录 创建 StringBuffer 类 追加字符串 替换字符 反转字符串 删除字符串 StringBuffer 方法 在 Java 中,除了通过 String 类创建和处理字符串之外,还可以使用 S ...

  3. JVM解析

    synize锁升级

  4. 复习精简版快速学vue3

    vue2中.如果给一个之前没有定义的属性赋值,会得不到时实更新: this.obj.b=2 //由于这个属性之前没有定义,是不支持动态响应,只能用this.$(this.obj,'b',2)也就是说v ...

  5. [pyplot]在同一画面上绘制不同大小的多个图像

    一.背景 做计算机应用数学作业时要求使用matplotlib库在同一张图上绘制两个图像,但是这两个图像的大小不同,百度之后发现大部分只是转载的同一篇博客,而且只能实现部分子图比例排版,并不能随意设置各 ...

  6. FTP的安装和使用

    实验环境: windows server虚拟机一台 网络适配器:vmnet1 ip:192.168.1.220 一.安装FTP服务 打开服务器管理器 点击添加角色,勾IIS,点击下一步直到对话框消失 ...

  7. 单目测距那些事儿(上) | 从MobileEye谈起

    单目测距那些事儿(上) | 从MobileEye谈起 全面专业的自动驾驶学习资料:链接 前言 在ADAS领域,有个功能叫自适应巡航控制(Adaptive Cruise Control, ACC). A ...

  8. 三维模型3DTile格式轻量化压缩处理工具常用几款软件介绍

    三维模型3DTile格式轻量化压缩处理工具常用几款软件介绍 三维模型3DTile格式的轻量化处理旨在减少模型的存储空间和提高渲染性能.以下是一些推荐的工具软件,可以用于实现这个目的: MeshLab: ...

  9. 记录--两行CSS让页面提升了近7倍渲染性能

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 对于前端人员来讲,最令人头疼的应该就是页面性能了,当用户在访问一个页面时,总是希望它能够快速呈现在眼前并且是可交互状态.如果页面加载 ...

  10. C++ Concurrency in Action 读书笔记一:thread的管理

    为避免混淆,用thread表示std::thread及其对象实例,用线程表示操作系统概念下的线程 Chapter 2 thread的管理 2.1 thread的创建(构造函数) a. 默认构造函数 d ...