写点什么

请您谈下数据库调优,指的是哪方面?

  • 2021 年 11 月 12 日
  • 本文字数:1997 字

    阅读完需:约 7 分钟

读写[写: update/delete/add]分离


存储过程 [模块化编程,可以提高速度]


对 mysql 配置优化 [配置最大并发数 my.ini, 调整缓存大小 ]


mysql 服务器硬件升级


定时的去清除不需要的数据,定时进行碎片整理(MyISAM)


对于一个以数据为中心的应用,数据库的好坏直接影响到程序的性能,因此数据库性能至关重要。一般来说,要保证数据库的效率,要做好以下四个方面的工作:


① 数


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


据库设计


② sql 语句优化


③ 数据库参数配置


④ 恰当的硬件资源和操作系统


此外,使用适当的存储过程,也能提升性能。


这个顺序也表现了这四个工作对性能影响的大小


数据库表设计


通俗地理解三个范式,对于数据库设计大有好处。在数据库设计中,为了更好地应用三个范式,就必须通俗地理解三个范式(通俗地理解是够用的理解,并不是最科学最准确的理解):


第一范式:1NF 是对属性的原子性约束,要求属性(列)具有原子性,不可再分解;(只要是关系型数据库都满足 1NF)


第二范式:2NF 是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;


第三范式:3NF 是对字段冗余性的约束,它要求字段没有冗余。 没有冗余的数据库设计可以做到。


但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是: 在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。


冗余的结论:


1—n 冗余应当发生在 1 这一方.


SQL 优化的一般步骤


通过 show status 命令了解各种 SQL 的执行频率。


定位执行效率较低的 SQL 语句-(重点 select)


通过 explain 分析低效率的 SQL


确定问题并采取相应的优化措施


SQL 语句优化-定位慢查询


默认情况下,mysql 认为 10 秒才是一个慢查询.


SQL 语句优化-explain 分析问题


Explain select * from emp where ename=“wsrcla”


会产生如下信息:


select_type:表示查询的类型。


table:输出结果集的表


type:表示表的连接类型


possible_keys:表示查询时,可能使用的索引


key:表示实际使用的索引


key_len:索引字段的长度


rows:扫描出的行数(估算的行数)


Extra:执行情况的描述和说明


建立适当的索引


说起提高数据库性能,索引是最物美价廉的东西了。不用加内存,不用改程序,不用调 sql,只要执行个正确的’create index’,查询速度就可能提高百倍千倍,这可真有诱惑力。可是天下没有免费的午餐,查询速度的提高是以插入、更新、删除的速度为代价的,这些写操作,增加了大量的 I/O。


btree 类型的索引,就是使用的二分查找法,肯定快啊,算法复杂度是 log2N,也就是说 16 条数据查 4 次,32 条数据查 5 次,64 条数据查 6 次….依次类推。


使用索引跟没使用索引的区别,就跟我们使用新华字典查字,一个是根据拼音或者笔画查找,一个是从头到尾一页一页翻。


索引的代价


1、磁盘占用


2、对 dml(update delete insert)语句的效率影响


btree 方式检索,算法复杂度: log2N 次数


简述 mysql 四种索引的区别


PRIMARY 索引 =》在主键上自动创建


UNIQUE 索引=> 只要是 UNiQUE 就是 Unique 索引.(只能在字段内容不重复的情况下,才能创建唯一索引)


INDEX 索引=>就是普通索引


FULLTEXT => 只在 MYISAM 存储引擎支持, 目的是全文索引,在内容系统中用的多, 在全英文网站用多(英文词独立). 中文数据不常用,意义不大,国内全文索引通常使用 sphinx 来完成,全文索引只能在 char varchar text 字段创建.


选择合适的存储引擎


MyISAM:如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性要求不是很高。其优势是访问的速度快。


InnoDB:Mysql5.6 默认的 MySQL 存储引擎,提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比 MyISAM,写的处理效率差一些并且会占用更多的磁盘空间。


Memory:数据存在内存中,服务重启时,数据丢失


MyISAM: 在插入数据时,默认放在最后. ,删除数据后,空间不回收.(不支持事务和外键)


如果选用小原则:


1.如果追求速度,不在乎数据是否一直保存,也不考虑事务,请选择 memory 比如存放用户在线状态.


2.如果表的数据要持久保存,应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性要求不是很高。选用 MyISAM


3.如果需要数据持久保存,并提供了具有提交、回滚和崩溃恢复能力的事务安全,请选用 Innodb


对表进行水平划分


如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了。如果我拆成 100 个表,那么每个表只有 10 万条记录。当然这需要数据在逻辑上可以划分。一个好的划分依据,有利于程序的简单实现,也可以充分利用水平分表的优势。比如系统界面上只提供按月查询的功能,那么把表按月拆分成 12 个,每个查询只查询一个表就够了。如果非要按照地域来分,即使把表拆的再小,查询还是要联合所有表来查,还不如不拆了。所以一个好的拆分依据是 最重要的。关键字:UNION


对表进行垂直划分

评论

发布
暂无评论
请您谈下数据库调优,指的是哪方面?