zoukankan      html  css  js  c++  java
  • mysql单列索引和联合索引的使用

    1,首先要确定优化的目标,在什么样的业务场景下,表的大小等等。如果表比较小的话,可能都不需要加索引。
    2,哪些字段可以建索引,一般都where、order by 或者 group by 后面的字段。
    3,记录修改的时候需要维护索引,所以会有开销,要衡量建了索引之后的得与失。
    学生表,可以认为name的重复度比较小,而age的重复度比较大,对于单列索引来说,比较适合建在重读度低的列上。
    对于select * from students where name='张三’and age=18; 题主所说的两种情况
    A. name 和 age 各自单独建立索引。
    一般来说mysql会选择其中一个索引,name的可能性比较大,因为mysq会统计每个索引上的重复度,选用低重复度的字段。另外一个age的索引就不会用到,但还有维护索引的开销,所以age的索引不需要创建。
    B. name和age的联合索引
    这种索引的切合度最好,mysql会直接选用这个索引。但相对单独的name索引来说,维护的成本要大一些,并且索引数据占用的存储空间也要更大一些。
    回过来看,有必要使用联合索引吗? 我的看法是没有必要,因为学校里可能会有重名的人,但比较少。用name就可以比较精准的找到记录,即使有重复的也比较少。
    什么情况下使用联合索引比较好呢? 举一个例子,大学选认课老师,需要创建一个关系对应表,有2个字段,student_id 和 teacher_id,想要查询某个老师和某个学生是否存在师生关系。
    一个学生会选几十个老师,一个老师会带几百个学生
    如果只为student_id建立索引的情况下,经过索引会选出几十条记录,然后在内存中where一下,去除其余的老师。
    相反如果只为teacher_id建立索引,经过索引会选出几百条记录,然后在内存中where一下,去除其余的学生。
    两种情况都不是最优的,这个时候使用联合索引最合适,通过索引直接找到对应记录。

    作者:范孝鹏
    链接:https://www.zhihu.com/question/40736083/answer/88191544
    来源:知乎

  • 相关阅读:
    WPF Caliburn 学习笔记(五)HelloCaliburn
    MSDN 教程短片 WPF 20(绑定3ObjectDataProvider)
    MSDN 教程短片 WPF 23(3D动画)
    比赛总结一
    HDU3686 Traffic Real Time Query System
    HDU3954 Level up
    EOJ382 Match Maker
    UESTC1565 Smart Typist
    HDU3578 Greedy Tino
    ZOJ1975 The Sierpinski Fractal
  • 原文地址:https://www.cnblogs.com/b3051/p/7596608.html
Copyright © 2011-2022 走看看