博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MYSQL 索引
阅读量:5781 次
发布时间:2019-06-18

本文共 1209 字,大约阅读时间需要 4 分钟。

hot3.png

数据库表添加索引可以提高查询效率,开发中我们经常使用的索引有唯一索引和组合索引。

  • 唯一索引 (数据库表多列加上唯一索引,可以保证在并发条件下,数据库不会有脏数据。因为

    在开发中,我们很多业务场景都需要保证数据库记录的唯一。如果字段建立了唯一索引,但是

    值为null,这时唯一索引是不生效的,这时可以考虑用空字符串代替null)

  • 组合索引 (给数据库表的多列建立索引,该索引不保证唯一性,目的是提高数据库查询的效率)

索引底层的数据结构是 B+ 树,它可以减小硬盘与内存之间的 IO,以提高检索效率。建立索引的原则:

  1. <最左匹配原则> 对于多列索引, mysql 总是从最左匹配,中间的不可以跳过。例如建立了索引

    idx_name_age_gender. 查询时会优先匹配 name 字段,然后 age 字段,最后匹配 gender 字段。

    中间的字段不可以跳过。mysql 会一直向右匹配,直至遇到(>, <, between, like 字段就停止);

    因此,我们在创建组合索引时,把 where 子句使用最频繁的放在最前面。

  2. <=和in可以乱序> ,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式

  3. <选择区分度高的字段建立索引> 区分度 count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少;

  4. <索引值不要参加运算>。如果索引值参与运算,每次索引前都要计算一次,成本太高;

  5. 尽量不要新建索引,可以在原索引的基础上进行扩展;

SQL 优化

  1. like 后面的参数如果以 通配符开头,不会走索引查询,会走全表扫描;

  2. where 子句不符合 最左匹配原则时,不会走索引查询;例如 device_info 表 索引 idx_devicename_devicecategory,

    select * from device_info  where device_name = "xxx" , 这个sql 就不会走索引查询;

  3.  避免在where子句中使用or来连接条件,否则将导致引擎放弃使用索引而进行全表扫描 .这时可以考虑使用 union 代替;

  4. 尽量避免使用!=, <, > 操作符,否则数据库引擎会放弃使用索引而进行全表扫描;

  5. 避免使用 select * . 在解析的过程中,会将’*’ 依次转换成所有的列名,这是通过查询数据字典完成的,会耗费更多的时间;

  6. 可以使用 destinct 就不要使用 groupBy;

  7. 如果应用程序有很多 join 查询,最好给两个表中Join的字段建立索引;

  8. 如果sql 执行比较慢,可以考虑使用explain 语句查看sql 的执行计划;

转载于:https://my.oschina.net/freedemon/blog/1823721

你可能感兴趣的文章
软件开发学习的5大技巧,你知道吗?
查看>>
java入门第二季--封装--什么是java中的封装
查看>>
【人物志】美团前端通道主席洪磊:一位产品出身、爱焊电路板的工程师
查看>>
一份关于数据科学家应该具备的技能清单
查看>>
机器学习实战_一个完整的程序(一)
查看>>
Web框架的常用架构模式(JavaScript语言)
查看>>
如何用UPA优化性能?先读懂这份报告!
查看>>
这些Java面试题必须会-----鲁迅
查看>>
Linux 常用命令
查看>>
NodeJS 工程师必备的 8 个工具
查看>>
CSS盒模型
查看>>
ng2路由延时加载模块
查看>>
使用GitHub的十个最佳实践
查看>>
脱离“体验”和“安全”谈盈利的游戏运营 都是耍流氓
查看>>
慎用!BLEU评价NLP文本输出质量存在严重问题
查看>>
基于干净语言和好奇心的敏捷指导
查看>>
Node.js 2017企业用户调查结果发布
查看>>
“软”苹果水逆的一周:杂志服务崩溃,新机型遭泄露,芯片首架离职
查看>>
JAVA的优势就是劣势啊!
查看>>
ELK实战之logstash部署及基本语法
查看>>