• 老毕
    2019-08-03
    联合索引的最左原则就是说,索引是一种顺序结构,我们按照什么顺序创建索引,就只能按照这个顺序使用索引,这容易理解。

    假设我们有X、Y、Z三个字段,创建联合索引(X, Y, Z),可以理解成,数据库按照不同的权重排列了XYZ,形成了一个新值。

    如果把X、Y、Z分别类别成“百分位”、“十分位”和“个位”,则新值XYZ依次排列在索引上。

    查询“X=9 AND Y=8 AND Z=7”的过程,就是在一个由小到大排列的数值序列中寻找“987”,可以很快找到。

    查询“Y=8 AND Z=7”,就用不上索引了,因为可能存在187、287、387、487...,这样就必须扫描所有数值。

    查询“Z=7 AND Y=8 AND X=9”,看上去所有字段都用上了,也可以按照百分位、十分位和个数的逻辑去利用索引,但SQL不会自动识别出联合索引顺序与联合查询的顺序,它会严格地按照字面顺序去套用索引,只要不匹配,就不用。

    综上,使用联合索引的时候,字段顺序不能乱,查询字段可以少,但只能从右侧开始减少,不能从左侧。

    这就像按顺序查数值,先找高位再找低位(索引扫描),如果先找十分位或者先找个位,那就只能每个数值都看一下(全扫描)。
    展开

    作者回复: 这个比喻解释的很形象,另外在这个基础上还需要说明下:
    1)SQL条件语句中的字段顺序不重要,因为在逻辑查询优化阶段会自动进行 查询重写。
    2)如果我们遇到了范围条件查询,比如<、<=、>、>=、between等。那么范围列后的列就无法使用到索引

     5
     31
  • 峻铭
    2019-09-10
    使用聚集索引的时候,数据的查询效率高,但如果对数据进行插入,删除,更新等操作,效率会比非聚集索引低。对这句话我不明白,为什么插入、删除、更新等操作,效率会比非聚集索引低,这三个操作内部都是先进行了查询的,聚集索引属于存储结构的物理索引,查询效率高,自然插入、删除、更新的效率也高啊。实在不解

    作者回复: 聚集索引是面向读取的设计,因为我们的数据会按照聚集索引的大小顺序写入到磁盘,因此聚集索引会存在存储顺序的问题。而我们更新,插入的内容往往都是随机的,这时如果我们还是用聚集索引,所有的记录就需要重新进行排序并重新写入到磁盘中,所以效率相比于非聚集索引可能会降低。
    而非聚集索引只是存储索引,我们只需要更新这个索引即可,不需要对所有的记录重新排序。

     1
     5
  • Fargo
    2019-08-09
    老师没讲如何创建索引,可以参考https://www.runoob.com/mysql/mysql-index.html

    作者回复: 多谢分享

    
     5
  • 许童童
    2019-08-02
    使用联合索引时,如果可以使用索引覆盖,那就不用回表,查询性能更好了。

    作者回复: 是的

     3
     3
  • 未来的胡先森
    2019-08-14
    计算机实际是对现实生活的一个抽象,正如索引来自于生活中的字典。

    作者回复: 索引比喻的不错,计算机算是运用数学工具,帮我们自动化解决问题

    
     2
  • 梁
    2019-11-19
    “当数据重复度大,比如高于 10% 的时候,也不需要对这个字段使用索引。”,文中还举例到了“性别”字段,这类数据重复度大,不正好适合位图索引吗?

    作者回复: 对 位图索引适合

    
     1
  • Elliot
    2019-09-13
    一旦创建了索引,你需要先访问 50 万次索引,然后再访问 5...

    这句话还是不太理解,可以再详细解释一下吗?非常感谢

    作者回复: 因为二级索引(辅助索引)并不存储我们想要SELECT的具体数据,因此是通过二级索引想找到主键,然后再通过主键找到具体的数据。这种方式也称之为回表,是因为索引没有对SELECT查询的字段进行完全覆盖。

     1
     1
  • Monday
    2019-08-11
    百度网盘下载真慢,另外请老师提供一个存储过程插入用户表。

    作者回复: 大数据量插入的存储过程,我在专栏里应该有写

    
     1
  • 阿锋
    2019-08-02
    普通索引、唯一索引、主键索引和全文索引,它们对应聚集索引还是非聚集索引?
     1
     1
  • 捞鱼的搬砖奇
    2019-08-02
    sql能同时提供到github上吗
    
     1
  • superMO潼
    2020-01-15
    在oracle中建立联合索引(x y z) 如果表数据量很大 如果查询条件使用y=?and z =? 是有可能走到索引的 比全表扫描cost低
    
    
  • 吃饭饭
    2020-01-08
    我突然有个问题想咨询一下:是不是 MySQL 每次查询只能匹配一个索引?
    
    
  • 学海求知
    2020-01-03
    有两个问题想咨询下。
    1.范围查询后的列无法使用索引,应该只是在联合索引中吧?具体的原因是什么?从联合索引的结构上感觉还是可以走的
    2.普通索引存储的主键值,查到主键值以后还需要回表,那范围查询后拿到了一批主键值,这时候是如何查询的?
    
    
  • 旅途
    2019-12-27
    老师 问个问题 每个表都有聚集索引吧 即使使用非聚集索引 进行 插入 删除 更新 也会使聚集索引更新吧
    
    
  • rike
    2019-12-12
    留言中“使用联合索引时,如果可以使用索引覆盖,那就不用回表,查询性能更好了。”不知是什么意思?
    
    
  • 爱思考的仙人球
    2019-10-20
    在性别这类重复度高的字段上,oracle可以创建位图索引

    作者回复: 对 bitmap是不错的方式

    
    
  • 雪飞鸿
    2019-09-17
    为什么是最左匹配而不是最右匹配

    作者回复: 从左到右的顺序

    
    
  • 峻铭
    2019-09-10
    索引的最左原则,可以假设通过联合索引进行检索的过程为一个函数f(X x=0,Y y=0,Z z=0),参数都有默认值,where条件具有联合索引的字段会依次传入函数中,那么可以传入的情况有(X,Y,Z) 或者(X,Y)或者(X)
    
    
  • Z.CC
    2019-09-10
    100万条数据是怎么插入的。。。

    作者回复: 我写的存储过程插入的…

     1
    
  • 扫地僧
    2019-08-13
    有一个疑惑,文中老师又讲到聚集索引和非聚集索引,我这么理解不知道是不是对的?
    (1)两者是基于物理实现来划分;
    (2)聚集索引我可以简单的理解为主键索引;非聚集索引则是除主键索引以外的其他字段建立的索引,比如一个user表除了id字段的name,deptId等字段;
    (3)非聚集索引只是一个名称,创建索引的方式还是按照基本的方式创建即可。
    
    
我们在线,来聊聊吧