MySQL 数据库优化

常用数据库引擎 MyISAM 和 InnoDB的区别:

InnoDB 事务优先,对于每一条SQL语言都默认封装成事务并自动提交,支持外键,不保存表的具体行数,执行select count(*) 时需要全表扫描,适合高并发操作,行锁。

MyISAM 性能优先,不支持事务和外键,用变量保存整个表的行数,执行select count(*) 时读取该变量即可,表锁。

 

1.SQL 语句优化:

首先提出语句的解析过程:From .. On .. Join .. Where .. Group by .. Having .. Select Dinstinct .. Order by Limit ..

对查询进行优化,应尽量避免全表扫描。首先应考虑在 where 及 order by 涉及的列上建立索引,使用连接 JOIN 来代替 子查询,不使用NOT IN 和 <>,因为它们不会使用索引而选择进行全表扫描,可以用 NOT EXISTS 和 ID>3 OR ID<3 代替。

全表扫描:对无索引的表进行查询一般称为全表扫描。对给定一个值的条件查询时会扫描整个表该列所有的值。

 

2.索引优化:

索引相当字典的目录,索引是数据结构(默认为B树)。

如下图:数据表 student(id,name,age) 中 age 这一列在执行图中语句时,加与不加索引两种情况的区别,加上索引查询时根据结构B树,只需要3次即可找到,而不是全表扫描。

分类:主键索引(使用 primary key 时默认创建)、单值索引 index、唯一索引 unique(不能重复的列如ID,可以为空)、复合索引(多个列构成,也可以单列使用)

语法:CREATE 索引类型 索引名 on 表(字段)

举一个创建复合索引的例子:CREATE INDEX DEPT_NAME_INDEX ON TABLENAME(DEPT,NAME)

查询索引:SHOW INDEX FROM TABLE

什么情况下需要创建MySQL索引?

1、较频繁地作为查询条件的字段

2、唯一性太差的字段不适合建立索引,如状态字段、类型字段,那些只存储固定几个值的字段,有点像枚举

3、更新太频繁地字段不适合创建索引

4、不会出现在where条件中的字段不该建立索引

索引的弊端是什么?

不是所有场景适用(少量数据、频繁更新、很少使用的字段)、会降低增删改的效率(因为需要对索引进行更新,绝大部分操作是做查询)

 

3.读写分离:

简单说就是将原有数据库分为主、从两个数据库,让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。

在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。

不一定都要读写分离,如果程序与数据库间更新少,查询多时考虑使用,利用数据库 主从同步 。可以减少数据库压力,提高性能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值