index(a, b, c) 为例:

语句 发挥作用的索引 记忆方法(以三块板子过河记忆, 顺序很重要)
WHERE a=3 只用到了a列 只走了a板子
WHERE a=3 AND b=5 使用了a、b列 只走了ab两块板子
WHERE a=3 AND b=4 AND c=5(不论顺序) 使用了a、b、c列 走了所有的板子
WHERE b=4 AND c=5 或 WHERE b=4 因为a板子没走,所以衔接不上b和c板子
WHERE a=3 AND c=5 用到a,没用到c 只走了a,b没走就衔接不上c
WHERE a=3 AND b>10 AND c=7 用到了a、b列 走完了a,b走了一半,与c衔接不上了
WHERE a=3 AND b LIKE '***%' AND c=7 用到了a、blie 走完了a,b走了前一半,与c衔接不上了
WHERE a=3 AND b LIKE '%***' AND c=7 只用到了a列 走完了a,b走了后一半,但b前半段与a衔接不上了,走也是白走
WHERE a=3 AND c>10 AND b=4 用到了a、b、c列 走完了a和b,c只走了一半

注意:1)例子里都是 WHERE 语句,但 ORDER BY/GROUP BY 等都会用到索引,分析与上面一样

2)MySQL会一直向右匹配,直到查询中遇到范围查询(<、>、between、like)等就停止匹配

3)具体分析用explain语句,详细参见http://www.zixue.it/thread-9218-1-1.html

一道面试题:

有商品表,商品id列goods_id,栏目列cat_id,价格列price。

问题:已在价格列上添加索引,但按价格查询还是很慢,为什么?怎么解决?

答:在实际场景中,一个电商网站的商品很多,用户很少上来就按价格查询,一般会进到分类或品牌下再进行查询。

解决方法:去掉单独的price列的索引,增加(cat_id,price)复合索引。

如果根据日志统计发现许多人按照品牌来查询,也可以改为(cat_id,brand_id,price)复合索引

MySQL之联合索引的更多相关文章

  1. Mysql 创建联合索引注意事项

      当一个表有多条索引可走时,  Mysql  根据查询语句的成本来选择走哪条索引, 联合索引的话, 它往往计算的是第一个字段(最左边那个), 这样往往会走错索引. 如: 索引Index_1(Crea ...

  2. Mysql中联合索引的最左匹配原则

    在Mysql建立多列索引(联合索引)有最左前缀的原则,即最左优先. 如果我们建立了一个2列的联合索引(col1,col2),实际上已经建立了两个联合索引(col1).(col1,col2); 如果有一 ...

  3. 一个案例彻底弄懂如何正确使用 mysql inndb 联合索引

    有一个业务是查询最新审核的5条数据 SELECT `id`, `title` FROM `th_content` WHERE `audit_time` < 1541984478 AND `sta ...

  4. mysql的联合索引的误解

    https://www.zhihu.com/question/36996520 之前对于联合索引有一个误区, 假设 name,age为一个联合索引 5条索引记录 a 10 b 5 c 12 c 15 ...

  5. Mysql中联合索引的最左匹配原则(百度)

    创建联合索引时列的选择原则 经常用的列优先(最左匹配原则) 离散度高的列优先(离散度高原则) 宽度小的列优先(最少空间原则) 在Mysql建立多列索引(联合索引)有最左前缀的原则,即最左优先.如果我们 ...

  6. mysql使用联合索引提示字符长度超限制解决办法

    ​ mysql在创建数据库的时候,字符集设置的不是utf8而是utf9mb4,在导入sql脚本的时候,发现提示如下错误: ​ 从上图中,我们可以看出,使用的是innodb及字符集.错误提示是长度太长了 ...

  7. mysql选择联合索引还是单索引?索引列应该使用哪一个最有效?深入測试探讨

    先建表 CREATE TABLE `menu_employee` ( `Id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键,无实际意义', `emplo ...

  8. MySQL联合索引运用-最左匹配原则

    前言 之前看了很多关于MySQL索引的文章也看了<高性能MySQL>这本书,自以为熟悉了MySQL索引使用原理,入职面试时和面试官交流,发现对复合索引的使用有些理解偏颇,发现自己的不足整理 ...

  9. MySQL 联合索引详解

    MySQL 联合索引详解   联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c ...

随机推荐

  1. Cisco 交换Vlan配置

    添加Vlan命令 #添加vlan100 config)#vlan 100 #重命名vlan100 config-vlan)#name vlan100 #返回上一层 config-vlan)#exit ...

  2. 深入 CommonJs 与 ES6 Module

    目前主流的模块规范 UMD CommonJs es6 module umd 模块(通用模块) (function (global, factory) { typeof exports === 'obj ...

  3. Android中C可执行程序编译问题

    make:进入目录'/opt/FriendlyARM/tiny4412/android/android-4.1.2'make: *** 没有规则可以创建“out/target/product/gene ...

  4. Java Swing简单的加法器

    package test; import java.awt.*; import javax.swing.*; import java.awt.event.*; public class FrameDe ...

  5. Linux 服务器buff/cache清理

    使用Top命令查看内存及缓冲区使用情况 当磁盘频繁产生IO时会导致buff/cache占用很高的内存,导致可用物理内存很少 但是当真正需要内存时,缓冲区内存会自动释放. 如果需要清理可以用 cache ...

  6. 客户端发一个post请求

    public static String doPostStr(String httpUrl, String str) { HttpPost httpPost = null; try { HttpCli ...

  7. ETL增量处理总结

    1 LOG表 1.1 思路 用log表记录业务库某表yw_tableA发生变化数据的主键.数据进入BI库目标表bi_tableA前,先根据log表记录的主键进行delete. 1.2 设计 1.2.1 ...

  8. 5.scala中的对象

    排版乱?请移步原文获得更好的阅读体验 1.单例对象 scala中没有静态类或者静态方法,都是通过object实现的,它表示某个类的单例对象.如object People是class People的单例 ...

  9. 在centos 6.9下Protocol Buffers数据传输及存储协议的使用(python)

    我们知道Protocol Buffers是Google定义的一种跨语言.跨平台.可扩展的数据传输及存储的协议,因为将字段协议分别放在传输两端,传输数据中只包含数据本身,不需要包含字段说明,所以传输数据 ...

  10. linux一键安装mysql脚本

    #!/bin/sh if [ -s /etc/my.cnf ];then rm -rf /etc/my.cnf fi echo "------------------------------ ...