zoukankan      html  css  js  c++  java
  • mysql数据库索引优化

    MySQL数据库的优化:
       数据库优化的目的:
              1、避免出现页面访问错误(
                              由于数据库连接timeout产生的5XX错误
                              由于慢查询造成页面无法加载
                              由于阻塞造成数据无法提交)
              2、 增加数据库的稳定性(很多数据库问题都是由于低低效查询引起的)
              3、优化用户体验(流畅页面的访问速度 , 良好的网站功能体)
       可以从以下几个方面进行优化:SQL及索引,数据表结构,系统配置,硬件。其中SQL及索引最重要,首先我们要根据我们的需求写出结构良好的SQL,另外要根据SQL在表中建立有效的索引,但是如果我们的索引过多,不但会影响我们写入的效率,同时还会影响我们查询的效率,所以索引建立要适量有效。但是如果表结构设计不合理,我们就很难写出结构良好的SQL,所以要建立简洁明了的表结构,所以说在设计表结构的时候,我们要考虑怎样对表结构进行查询,怎样的表结构的设计才是有利于表结构的查询,然后是系统配置的优化,但是当前我们大多数的MySQL都是在lnuix系统上,但是系统上是有一些本身的限制,比如说:TCP/IP连接数的限制,打开文件数的限制和一些安全上的限制,因为MySQL查询是基于文件的,没查询一个表就要打开一个文件,如果文件数达到一定的限制,这个文件就无法打开。硬件优化,就是我们要选择更适合数据库的CPU,更快的IO,以及更多的内存,数据库数据要放在内存中查询修改,所以内存越大,对我们数据库的性能就越好,但CPU却不是这样的,CPU越大,不见得对数据库性能越好,因为SQL会对CPU的可数有限制,比如说他并不会用到太多的核数,有的查询他只用于单核,所以说CUP也对数据库有影响,并不是核数越多越好,而IO,目前由于多新型IO设备,如 ssd,,但它并不能减少数据库锁的机制,因为锁是数据库保存完整性的一种机制,虽然IO很快,但它并不能减少阻塞,所以我们说硬件上的优化是成本最高但效果最差的,所以说如果慢查询很多,阻塞很多,那么并发量就会上去,导致应用响应缓慢。
     
    1.SQL及索引的优化
        对Max(),Count()函数的优化,子查询的优化,group by 的优化(目的是减少IO),limit优化(使用有索引的列或主键进行orderby操作以避免IO)
     
         a. 如何选择合适的列建立索引: 在where从句,group by, order by,on从句中出现的列建立索引;索引字段越小越好;离散度大的列放到联合索引的前面。
         b.索引的维护及优化------重复及冗余索引和对不用索引的删除
     2.数据库结构的优化
        a.选择合适的数据类型,数据类型的选择,重点在于合适。 
         b.表的范式化和反范式化(范式化指的是表设计的规则) 
             反范式化是指为了查询效率的考虑把原本符合第三范式的表适当的增加冗余,已达到优化效率的目的,反范式化是以空间换时间的做法。
         c.表的垂直拆分,解决了表的宽度问题。将不常用的字段拆分出来。
         d.表的水平拆分,解决表的数据量过大的问题。
    3.系统配置的优化。及MySQL配置文件的优化   
     
    根据SQL语句中以下关键词建立索引:
     
    查找:select
           
    别名:AS
        select id AS userId,username AS uname From users;
    查询结果分组:group by
       select sex from users group by sex;
      分组条件:HAVING +聚合函数、或者是having后的字段出现在select后面
        select age,sex from users group by sex HAVING age>2;
      对分组结果进行排序:order by    DESC 表示降序 默认为ASC升序
          select * from users order by id DESC; 
    限制查询结果返回的数量:limit
        select * from users LIMIT 2;/LIMIT 2,2 (指的是从第三条开始,限制2条)
    插入insert:
        insert test(username) select username from users where age>27;
    更新:update
    子查询:(not)in,(not)exists
    向单表插入:insert table_user1(username) select age from table_user2 group by age;
    连接类型:inner join,内连接
                  在MySQL中,join,cross join 和 inner join 是等价的。
           left [outer] join,左外连接
           right [outer] join,右外连接
       select username,age,sex 
       inner join  user2;
    函数:
    select CONCAT(username,age) AS u FROM user;//字符串链接
    聚合函数:Avg(),Count(),Max(),Min(),Sum()
    加密函数:MD5(),Password()
  • 相关阅读:
    js程序设计01——基本概念
    beego中orm关联查询使用解析
    使用bower管理前端依赖
    使用bee自动生成api文档
    app开发之deviceone
    使用socket.io开发简单群聊功能
    spring-boot配置热更新
    golang的xml、json解析
    golang学习之rpc实例
    golang学习之mgo操作mongodb
  • 原文地址:https://www.cnblogs.com/ScarecrowAnBird/p/6774418.html
Copyright © 2011-2022 走看看