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
来源:知乎

最新文章

  1. jQuery UI Datepicker
  2. jdbc应用程序连接Oracle rac的URL写法:
  3. 与number_format函数有关的一个bug?
  4. MongoDB的数据库基本操作(一)
  5. ftl文件格式化jsp形式显示
  6. CodeForces Round 196
  7. Java通过代理类实现数据库DAO操作
  8. C#中字符串驻留技术
  9. C++文件操作详解(ifstream、ofstream、fstream)
  10. C语言陷阱——类型转换
  11. nosql和关系型数据库比较?
  12. Mac系统中各个文件夹简单介绍(转)
  13. Python中迭代输出(index,value)的几种方法
  14. 伙伴系统之避免碎片--Linux内存管理(十六)
  15. PHPexcel(2)
  16. nginx学习笔记(二)
  17. Java入门(六):数组
  18. java StringBuilder和StringBuffer 用法
  19. [BZOJ 1879][SDOI 2009]Bill的挑战 题解(状压DP)
  20. JSON解析代码

热门文章

  1. 1:3访问 servlet API 的两种方式(request,session等内置对象)
  2. ruby中的win32ole使用
  3. poj1106 Transmitters
  4. uva1401 dp+Trie
  5. Jsuop Whitelist
  6. aTool在线工具
  7. Element-UI中Upload上传文件前端缓存处理
  8. 20145325张梓靖 《Java程序设计》第2周学习总结
  9. 如何运行.ipynb文件
  10. Android 开机Process xxx (pid xxxx) has died问题分析