• mysql优化(上)


    1. 磁盘组成  和  磁盘读取过程
    2. 尽量减少 i/o 操作。
    3. 表结构设计:
      (1)三范式 :   原子性(不可拆分)、唯一性(不能有完全相同的数据)、无冗余性(不能有多余的数据),对于冗余性说明一下:拿订单来举例,订单表里面是不需要有商品总额字段的。因为可以在程序中通过代码计算出来。存到数据库中就显得多余了。
      (2)字段: 选择顺序:数字> 时间 > 字符串
      (3)字段大小:够用即可,不要浪费。
      (4)select * from 表名 procedure analyse()     这个命令可以帮助我们参考选择合适的字段大小。
      (5)表拆分:把常用的和不常用的分开,比如用户表,用户名常用,像年龄、婚否、职业等等没必要放在主表中,可以放在附表中。
      (6)反三范式:就是允许冗余。比如上面提到的商品总额,可以单独用一个字段存储,这样可以提高读取效率。为什么呢?往下看,比如总额用的少,那我是不是就不需要存储它,反过来说如果使用总额比较频繁,那么虽然通过计算可以得到总额,但是存在一个问题,就是你要查询其他的字段,比如购买商品数(实际中购买数量存在session中),单价,这样查询的反而比只查询一个总额字段效率低(这个例子可能不太恰当,就是会有类似这种情况发生的)。至于设计表时,怎么选择,就要看具体情况了。
    4. 数据库引擎选择:memory、myisam、innodb
      (1)memory是将数据存在内存中,mysql重启之后数据就会丢失。
      (2)myisam和innodb 的区别:
        事务:innodb支持,myisam不支持
        查询速度:myisam较快,innodb相对较慢
             全文索引:myisam支持,innodb不支持
             锁机制:myisam支持表锁,innodb 支持行级锁
             文件存储形式:myisam三个文件:     frm(存储表的结构),myi(存储表的索引),myd(存储表的数据)
                                 innodb两个文件:frm(存储表的结构),ibd(存储数据和索引)
      查询较多时建议选择myisam,,需要事务支持选择innodb。
    5. mysql锁的分类:读锁:其他用户可以进行读操作,不能写操作。  写锁:其他用户不能读也不能写。
    6. 索引:通俗讲,就好比是字典的索引,书的目录。或者说好比把具有相同关键词的文章归一类存储,把具有另一个关键词的文章放在一起,这样查询的时候就会快很多。
    7. 索引原理:二叉树结构(就是二分查找算法原理)、hash索引
    8. 索引分类:主键、唯一索引、全文索引、一般索引。(索引参考文章)(再来一个,写的很好
    9. 慢查询:
      (1)如何定位执行较慢的语句:启动mysql服务并设置参数   
      mysqld_safe  --user=mysql  --slow_query_log  --slow_query_log_file=/tmp/slow_query.log  --long_query_time=1

      slow_query_log: 是否开启慢查询,slow_query_log_file: 慢查询日志文件存放位置,long_query_time:慢查询时间界限。

      (2)如果查看日志,可以借助mysql内置命令

      mysqldumpslow   /tmp/slow_query.log
    10. explain 可以分析SQL语句的执行计划以及检测是否使用索引。
      explain select*from user;  //explain放在查询语句之前

      执行上面语句后,会显示一张结果表,分析一下表里各个单词的含义。
      select_type:      搜索的类型
      table:                搜索的表名
      type:                 搜索的类型
      possible_keys: 可能用到的索引
      key:                  实际用到的索引
      key_len:           索引的长度
      ref:                   关联的字段
      rows:                扫描的行数
      Extra:               额外的信息

      关于type可能的值(性能由高到低排列):null>system>const>eq_ref>ref>range>index>all        针对这些值作如下解释:
      null:不使用索引,直接可以获得结果。

      explain select count(*) from user;

      system:表中满足条件的记录最多一条;

      explain select * from (select * from user limit 1) as a;

      const:表中满足条件的记录最多一条,通常出现在主键和唯一索引;

      explain select * from user where id = 1;

      eq_ref:表中某一列的值关联另一个表中主键列的值,通常用在联表查询;

      explain select * from user left join types on types.id = user.type_id;

      ref:通过普通索引查询;

      explain select * from user where username = '赵';

      range:索引范围查询;

      explain select * from user where id<10000;

      index:索引扫描;

      explain select id from user;

      all:全表扫描。

      explain select * from user;
      

        

    11. 命令行查看mysql语句执行时间:
      登录mysql
      mysql >
      //首先查看是否开启了profiling, mysql 版本必须大于5.0.37
      show variables like 'version';  ///查看mysql版本
      show variables like '%pro%';  //查看profiling是否开启
      //如果没有开启,则开启
      set profiling = on;
      // 执行mysql语句,show Profiles查看mysql语句执行时间
      show profiles;
      //会以表格的方式列出执行的每条语句的时间
  • 相关阅读:
    SOLO: 按位置分割对象
    支付宝架构
    h264和h265多维度区别
    机器学习图解
    机器视觉系统性能
    APA自动泊车系统
    智能驾驶测距估计
    结构感知图像修复:ICCV2019论文解析
    Lambda表达式
    转:利用 T-sql 的从句 for xml path('') 实现多行合并到一行, 并带有分隔符
  • 原文地址:https://www.cnblogs.com/bneglect/p/10420565.html
Copyright © 2020-2023  润新知