zoukankan      html  css  js  c++  java
  • MySQL优化

    一.sq优化方案:先看查询日志找到慢sql,再explain定位慢在哪个地方,再去加索引优化(一般sql优化首先考虑增加索引)

    explain select * from cyh where id = 100; --分析慢sql
    {
    select_type : simple (简单查询,单表查询) ,primary(主查询),union(联合查询),subquery(子查询)
    type: 连接类型。性能有好到差(system:表仅一行)(const:只有一行匹配)(ref:没有使用主键或唯一索引)(range:范围查询)(all:全表扫描)
    possible_keys:null(可能索引)
    key:null(命中的索引)
    ref:
    rows:8 扫描行数
    }

    alter table cyh add index cyh_sy(name)
    alter table cyh drop index cyh_sy


    二.常用sql语句预防点:

    (1)Where子句中:where表之间的连接必须写在其他Where条件之前,那些可以过滤掉最大数量记录的条件必须写在Where子句的末尾.HAVING最后。

    (2)用EXISTS替代IN、用NOT EXISTS替代NOT IN。

    (3)避免在索引列上使用计算

    (4)避免在索引列上使用IS NULL和IS NOT NULL

    (5)对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。  

    (6)应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描

    (7)尽量避免使用like语句时,匹配的起始位置用%,这将导致引擎放弃使用索引而进行全表扫描

    (8)where 条件中的‘or’和‘and’连接时,要么都加索引要么都不加索引

      (9)  避免隐式类型转换: where子句中出现column字段的类型和传入的参数类型不一致的时候发生的类型转换,建议先确定where中的参数类型。

    三.Mysql 的存储引擎,myisam和innodb的区别:

                     事务                                 外键                                                        锁                                                          优点                                             缺点                                                                                      存储结构

    MyISAM:  不支持事务                      不支持外键(关联的父子表)                只支持表级锁                                         查询贼快                                      由于只支持表级锁,也造成不能处理高并发的情况               索引和数据分开存储(.myd   ;  .myi) 

    innodb  :   支持事物                          支持外键                                                支持表级锁也支持行级锁                       支持高并发                                  查询不够优化                                                                         索引和数据存储在一起(.ibd)

    是非事务的存储引擎;适合用于频繁查询的应用(查询效率要由于innodb);表锁,不会出现死锁;适合小数据,小并发;不支持外键(关联父子表) 

    是支持事务的存储引擎;合于插入和更新操作比较多的应用;设计合理的话是行锁(最大区别就在锁的级别上);适合大数据,大并发;支持外键。

    解释相关名词:

    事务:绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。

    事务扩展のACID:

    1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。(简述:要么全做要么全不做)

    2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。(简述:能量守恒,不管你要怎样,你总得保存状态守恒

    3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。(简述:类似锁,当这个事务占用这组数据就不允许其他事务干扰

    4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。(简述:就是持久化存储

    事务扩展の隔离等级:数字越大隔离等级越高

    1.Read uncommitted:读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据。(脏读,我查询到了一个可能不是正确的数据)

    2.Read committed:读提交,就是一个事务要等另一个事务提交后才能读取数据。(解决脏读的问题,但是不能重复读:假如一个事务,两种查询返回不同结果,查询的同时另一个在update)

    3.Repeatable read:重复读,就是在开始读取数据(事务开启)时,不再允许修改操作。(解决不可重复读,但是会出现幻读,查询的同时另一个在insert)

    4.Serializable :是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。(解决幻读)

    数据库锁:锁包括行级锁和表级锁

    数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
    加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。

  • 相关阅读:
    关于使用lombok遇到的问题
    Android自定义View之旅(二)继承View实现自定义
    Android自定义View之旅(一)自定义View的几种方式
    Android中attr属性的类型
    Android Studio 4.0 新功能与优化
    WebView播放视频白屏、不能全屏问题解决
    Android配置Scheme使用浏览器唤起APP的方式,以及不生效问题解决
    Android获取的IMEI只有14位问题解决
    Android偶遇杂症合集(持续更新)
    AndroidKeystore密钥库系统,保证本地加密算法的密钥安全性
  • 原文地址:https://www.cnblogs.com/-cyh/p/10097940.html
Copyright © 2011-2022 走看看