java程序员必须知道的mysql优化的知识

java程序员必须知道的mysql优化的知识

前言:

mysql优化是java开发人员必备的技能之一,虽然可能比不上专业的DBA,但是一些常用的以及基本的mysq优化的知识还是需要知道,今天从总结一些常用的mysql优化的知识,并且是从实战的过程中来使用这些优化的技巧,简单、好用、且干货满满,在阅读本篇文章之前,最好是了解mysql执行计划的一些知识,大家可自行查找资料。直接上干货

整个优化分为如下:

  1. 需要在表中建立索引
  2. 不要在索引上做任何的操作
  3. 不等号(!= 、<>)要谨慎使用
  4. 尽量使用覆盖索引
  5. like查询要注意
  6. 字符串需要加引号
  7. UNION代替OR
  8. NULL或者NOT NULL的影响
  9. 尽量全值匹配
  10. 最佳左前缀法则
  11. 范围条件放最后面

下面我们一条条的来详细解读

1、需要在表中建立索引

建立索引当然要根据自己的业务情况,可以在使用频率高的字段中建立索引,也可以创建多个索引、联合索引。

我们先来看下以前我们同事设计的一张表,这个表设计存在一些问题,我们一个个来看

(1)表结构(varchar长度全是180)

java程序员必须知道的mysql优化的知识

(2) 索引情况(无索引)

java程序员必须知道的mysql优化的知识

 (3)数据量(75w)

java程序员必须知道的mysql优化的知识

 (4)查询结果需要多长时间

java程序员必须知道的mysql优化的知识

 也还好是吧,0.7秒多就完成了查询

(5)看下它的执行计划

java程序员必须知道的mysql优化的知识

type=all全表扫描,接下来我们给它新建一个索引,然后对比一下

(6)新建索引

java程序员必须知道的mysql优化的知识

(7)查询耗时

java程序员必须知道的mysql优化的知识 

查询的耗时明显已经不在一个数量级上,随着表越来越大,差距会越大 

 (8)加入索引之后的执行计划

java程序员必须知道的mysql优化的知识

可以看出type=ref,好了这就是建立索引的好处,下面的测试过程可能就不会向上面一样详细了,我就直接对比优化前和优化后的执行计划了,其中性能从大到小的排列是system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

2、不要在索引上做任何的操作

java程序员必须知道的mysql优化的知识

 上面虽然uid是索引,但是使用left导致索引失效,type=all

3、不等号(!= 、<>)要谨慎使用

java程序员必须知道的mysql优化的知识

type=all导致索引失效

 4、尽量使用覆盖索引

java程序员必须知道的mysql优化的知识

上面虽然在索引的上使用了!=号,但是使用了覆盖索引,所以type=index比type=all要快很多,如果需要查询多个字段,可以在使用频率较高的字段使用联合索引

5、like查询要注意

经常听到说不要使用like查询,但是在业务中我们做模糊查询的时候、需要使用like怎么办,看下面

java程序员必须知道的mysql优化的知识

like查询的确会导致type=all导致全表查询,如何优化,尽量将%写后面

 java程序员必须知道的mysql优化的知识

如果实在是业务需求,需要将%写前面,那我们可以使用覆盖索引

 java程序员必须知道的mysql优化的知识

 使用覆盖索引可以优化type=index

6、字符串需要加引号

java程序员必须知道的mysql优化的知识

字符串不加引号导致索引失效,全表扫面

java程序员必须知道的mysql优化的知识 

加了引号之后type=ref

 7、UNION代替OR

java程序员必须知道的mysql优化的知识

看下使用union的执行计划

java程序员必须知道的mysql优化的知识 

union中有一个是type=ref,所以效率肯定要好点,再看看如果or连接的都是索引呢

java程序员必须知道的mysql优化的知识

再看看union

java程序员必须知道的mysql优化的知识 

union的type是ref而or是range,根据上面的排序,ref的性能是比range要好的

 8、NULL或者NOT NULL的影响

java程序员必须知道的mysql优化的知识

再看下面这个执行计划

java程序员必须知道的mysql优化的知识 

查询条件 is null时索引不失效,为 is not null时索引失效。当这种情况下,又想要使用is not null 时同样可以使用覆盖索引优化,具体效果我就不贴上来了,可自行测试

9、尽量全值匹配

就说说如果建立了多个索引或者联合索引时,查询条件应当尽可能的使用多个索引

(1)使用一个索引的查询

java程序员必须知道的mysql优化的知识

(2)使用两个索引的查询条件

java程序员必须知道的mysql优化的知识 

他们的执行计划的type都是为ref的

10、最佳左前缀法则

如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列。

先来看下表结构

java程序员必须知道的mysql优化的知识

 上面的一张表建了一个联合索引,索引的顺序为uid、style_no、goods_num

当执行下面的执行计划时,看下效果

java程序员必须知道的mysql优化的知识

type=all说明没有使用索引,这就是没有使用最佳左前缀法则,当加入uid时,效果如下

 java程序员必须知道的mysql优化的知识

 type=ref,同样的道理当去掉style_no时,这是它的索引只有uid生效,而后面goods_num则失效,具体可以看key_len的长度判断(执行计划的知识),这里就不做演示了,可自行操作

11、范围条件放最后面

中间有范围查询会导致后面的索引列全部失效

java程序员必须知道的mysql优化的知识

uid使用了范围查询,所以导致索引全部失效(这里的中间的顺序表示的是索引的顺序,并不是where后面的顺序)比如即使把uid写道where的最后面,还是会导致全部失效

java程序员必须知道的mysql优化的知识

 同样如果第二个索引style_no使用了范围,则会导致goods_num索引也会失效,可自行操作

 

sql语句的优化就暂时先讲到这里,虽然sql优化能提升查询的效率,但是也会存在瓶颈,这就需要我们在设计表的时候要充分思考、不然sql语句再怎么优化可能也达不到最佳的效果。比如我们上面的表的信息中就可以看出varchar类型的长度全部是180(不管字段需要多长)这是非常低级的错误

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111230.html原文链接:https://javaforall.net

(1)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 面试java工程师的自我介绍_软件开发和程序员一样吗

    面试java工程师的自我介绍_软件开发和程序员一样吗程序员面试时一段短短的自我介绍,其实是为了揭开更深入的面谈而设计的。下面学习啦小编为你带来java程序员面试自我介绍范文的内容,希望你们喜欢。关于java程序员面试自我介绍范文篇一本人叫小冰,今年22岁,现在是吉林大学软件开发与信息管理专业方向的三年级学生,对软件开发怀有浓烈的兴趣,且对JAVA语言尤其熟悉,能熟练使用jsp、struts、struts2、sring2和hibernate3等流行的…

    2022年10月29日
    1
  • 【14】进大厂必须掌握的面试题-持续监控面试

    Q1。为什么需要连续监控? 我建议您遵循以下流程: 连续监视可以及时发现问题或弱点,并采取快速纠正措施来帮助减少组织的费用。持续监控提供的解决方案可解决以下三个运营准则: 持续审核…

    2020年10月23日
    391
  • Java程序员烂大街了吗?是,也不是

    Java程序员烂大街了吗?是,也不是Java程序员烂大街了吗?有网友吐槽精通的人少,半吊子的人烂大街。半吊子程序员确实不少,除了自身学习有关,还跟培训机构教学有关,工作后能不能继续学造有关,现在学编程的越来越多,所以企业要求相对也比前些年要高很多。  企业想招一个合格的Jjava程序员很不容易。烂大街的说法有网友不怎么赞同,因为市场自己会过,留下好的淘汰掉不合格的。不合格的程序员有一些会放弃,从事别的工作,也有的会坚持学习达到市场的要求。只不过还有很多人在选择进入这个行业而已,很正常的现象。  以前可能知道大概会怎么使用就能找份不

    2022年7月7日
    313
  • java认证考试题目_java程序员工资一般多少

    java认证考试题目_java程序员工资一般多少第一部分基础知识练习目标本章对应于《学生指南》各章的内容分别提供了练习题集,包括:●第一章Java入门●第二章数据类型和运算符●第三章流程控制与数组●第四章封装●第五章继承

    2022年8月3日
    20
  • Java程序员烂大街了吗?No or yes?

    Java程序员烂大街了吗?No or yes?Java程序员烂大街了吗?当下,越来越多的企业需要程序员,即使不是互联网公司,很普通的公司程序员也是标配。过去程序员属于稀缺岗位,而今随着技术的发展在二三线城市,甚至四线五线城市,小县城都有程序员的需求。作为一个发展越来越成熟的行业,Java程序员越来越多,自然会感觉程序员到处都是。小乐认为,虽然越来越多,也不必过分的担忧。虽然现在学Java做Java的人很多,但不难发现依旧有很多公司在招聘Java程序员。究其原因就是现在Java程序员虽然很多,但是精的很少。简单的增删该查估计一个门外汉网上找个开源

    2022年7月8日
    46
  • 【15】进大厂必须掌握的面试题-容器化和虚拟化面试

    Q1。什么是容器? 我的建议是首先解释对容器化的需求,容器用于提供一致的计算环境,从开发人员的笔记本电脑到测试环境,从过渡环境到生产环境。 现在给出容器的定义,一个容器包含一个完整…

    2020年10月23日
    414

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号