zoukankan      html  css  js  c++  java
  • mysql数据库重点(基础优化)

    ### Mysql性能优化


    尽量不要写select * ,如果需要全表数据,使用select 加所有字段列名称查询代替*
    尽量减少字段列的数学计算,如:where num * 2 >= 30,可改为 where num >= 30/2

    学会使用 explain 关键字 查看当前sql语句的优化程度
    例如:
    explain select * from emp where ename = "孙悟空"
    table : 表名
    type : 连接类型,从最差到最好分为 all(查询所有)、range(查询满足条件的)、 const(只有一条结果)。尽量不要用all类型的查询语句
    key :索引名,如果该列没有索引,则为null
    key_len : 索引长度,越短越好
    rows : 扫描行数,该值是个预估值
    extra : 详细说明,常见不太友好的值。如下:Using filesort ,Using temporary

    1、当只要一行数据时使用 limit 1
    表示只要第一页 第一条 数据,使用场景:
    查询时已知会得到一条数据,这种情况下加上 limit 1 可以提高查询性能。因为mysql 数据库引擎会在找到第一条结果停止搜索,而不是继续查询下一条是否符合条件直到查询完所有数据

    2、选择正确的数据库引擎
    MyISAS、InnoDB
    MyISAS 适合大量查询的应用。如果有 update语句,会锁住整张表,直到结束才能执行其他查询操作。
    InnoDB 是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,InnoDB 是默认的 MySQL引擎。

    3、索引添加
    对于经常用来查询的字段,应该为它建立索引。提高以该字段为搜索条件的查询效率
    添加方式:
    1.添加PRIMARY KEY(主键索引):
    ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )

    2.添加UNIQUE(唯一索引) :
    ALTER TABLE `table_name` ADD UNIQUE ( `column` )

    3.添加INDEX(普通索引) :
    ALTER TABLE `table_name` ADD INDEX index_name ( `column` )

    4.添加FULLTEXT(全文索引) :
    ALTER TABLE `table_name` ADD FULLTEXT ( `column`)

    5.添加多列索引:
    ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )

    4、表创建
    表关系
    一对一
    一对多:
    一的一方:主表
    多的一方:从表
    外键:需要在从表新建一列作为外键,他的取值来源主表的主键
    多对多:
    中间表:中间表中最少应该由两个字段组成,这两个字段作为外键指向两张表的主键,又组成了联合主键。
    在相对不严谨的项目中一般我们不创建表之间的关联(不使用外键关联)。都是使用代码控制他们逻辑上的关系。
     
    5、数据库尽可能的使用 NOT NULL 填充
    因为 select id from t where num is null 这样的 sql 也是可以的
    Mysql难以优化引用可空列查询,它会使索引、索引统计和值更加复杂。可空列需要更多的存储空间,还需要mysql内部进行特殊处理。可空列被索引后,每条记录都需要一个额外的字节,还能导致MYisam 中固定大小的索引变成可变大小的索引
    注意:但把NULL列改为NOT NULL带来的性能提示很小,除非确定它带来了问题,否则不要把它当成优先的优化措施,最重要的是使用的列的类型的适当性

    6、13.2 select * from admin left join log on admin.admin_id = log.admin_id where log.admin_id>10 如何优化? ?
    优化为: select * from (select * from admin where admin_id>10) T1 lef join log on T1.admin_id =log.admin_id。
    使用 JOIN 时候,应该 用小的结果驱动大的结果(left join 左边表结果尽量小如果有条件应该放到左边先处理,
    right join 同理反向),同时尽量把牵涉到多表联合的查询拆分多个 query(多个连表查询效率低,容易到之后锁表和
    阻塞)
     
    7、limit 的基数比较大时使用 between
    例如:select * from admin order by admin_id limit 100000,10
    优化为:select * from admin where admin_id between 1000000 and 1000010 order by admin_id。

    8、尽量避免在列上做运算,这样导致索引失效
    例如:select * from admin where year(admin_time)>2014
    优化为: select * from admin where admin_time> '2014-01-01′

    ### Mysql 事务

    1、事务的介绍
    Transaction
    事务只和DML(增删改)语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同
    在mysql 中事务是自动提交的,因为单条语句执行成功是自动提交的
    事务支持。开启、提交、回滚

    2、事务的四大特性
    原子性(A):事务是最小单位,不可再分
    一致性(C):事务要求所有的DML语句操作的时候,必须保证同时成功或者同时失败
    隔离性(I):事务A和事务B之间具有隔离性
    持久性(D):是事务的保证,事务终结的标志(内存的数据持久到硬盘文件中)

    * 事务四大特性之一————隔离性(isolation)
    事物A和事物B之间具有一定的隔离性
    隔离性有隔离级别(4个)
    读未提交:read uncommitted
    读已提交:read committed
    可重复读:repeatable read
    串行化:serializable

    1、 read uncommitted 读未提交
    - 事物A和事物B,事物A未提交的数据,事物B可以读取到
    - 这里读取到的数据叫做“脏数据”
    - 这种隔离级别最低,这种级别一般是在理论上存在,数据库隔离级别一般都高于该级别

    2、read committed 读已提交
    - 事物A和事物B,事物A提交的数据,事物B才能读取到
    - 这种隔离级别高于读未提交
    - 换句话说,对方事物提交之后的数据,我当前事物才能读取到
    - 这种级别可以避免“脏数据”
    - 这种隔离级别会导致“不可重复读取”
    - Oracle默认隔离级别

    3、repeatable read 可重复读
    - 事务A和事务B,事务A提交之后的数据,事务B读取不到
    - 事务B是可重复读取数据
    - 这种隔离级别高于读已提交
    - 换句话说,对方提交之后的数据,我还是读取不到
    - 这种隔离级别可以避免“不可重复读取”,达到可重复读取
    - 比如1点和2点读到数据是同一个
    - MySQL默认级别
    - 虽然可以达到可重复读取,但是会导致“幻像读”

    4、serializable 串行读
    - 事务A和事务B,事务A在操作数据库时,事务B只能排队等待
    - 这种隔离级别很少使用,吞吐量太低,用户体验差
    - 这种级别可以避免“幻像读”,每一次读取的都是数据库中真实存在数据,事务A与事务B串行,而不并发
  • 相关阅读:
    2018年第九届蓝桥杯国赛总结(JavaB组)
    yzm10的小简介
    论文学习笔记
    Tied Block Convolution:一种共享filter的卷积形态
    AI艺术鉴赏挑战赛
    论文学习笔记
    (转)论文学习笔记
    论文学习笔记
    2020 计蒜之道 预赛 第三场 石子游戏(简单)(暴力DP)
    第六周:生成式对抗网络
  • 原文地址:https://www.cnblogs.com/xuan-cz/p/10281171.html
Copyright © 2011-2022 走看看