关于数据库优化

数据库优化的几个方面:SQL语句以及有效索引、数据结构、系统配置、硬件

 


1. SQL以及索引的优化是最重要的。首先要根据需求写出结构良好的SQL,然后根据SQL在表中建立有效的索引。但是如果索引太多,不但会影响写入的效率,对查询也有一定的影响。

2. 要根据一些范式来进行表结构的设计。设计表结构时,就需要考虑如何设计才能够更有效的查询。

3. 系统配置的优化。MySQL数据库是基于文件的,如果打开的文件数达到一定的数量,无法打开之后就会进行频繁的IO操作。

4. 硬件优化。更快的IO、更多的内存。一般来说内存越大,对于数据库的操作越好。但是CPU多就不一定了,因为他并不会用到太多的CPU数量,有很多的查询都是单CPU。另外使用高的IO(SSD、RAID),但是IO并不能减少数据库锁的机制。所以说如果查询缓慢是因为数据库内部的一些锁引起的,那么硬件优化就没有什么意义。


、SQL语句优化

1、通过慢查询日志发现有效率问题的SQL

可以通过开启慢查询日志的方式进行定位有问题的SQL

(1)查看MySQL是否开启慢查询日志
show variables like 'slow_query_log';

 



(2)设置没有索引的记录到慢查询日志
set global log_queries_not_using_indexes=on;

(3)查看超过多长时间的sql进行记录到慢查询日志
show variables like 'long_query_time'

(4)开启慢查询日志
set global slow_query_log=on

(5)设置超时时间
Set global long_query_time=5;--超过5s的语句才记录日志

(6)查看慢查询日志的位置 show variables like 'slow%'


2、慢查询日志内容分析

慢查询日志主要分为5部分,第一部分是慢查询时间,第二部分是慢查询的来源主机和用户,第三部分是查询的执行时间、锁定时间、发送的行数、扫描的行数。最后是时间戳形式记录的命令以及该命令的执行的时间戳。

系统运行一段时间后,慢查询日志可能比较多,需要通过mysqldumpslow、pt-query-digest等工具分析慢查询日志。参考这里

3、通过explain查看SQL的执行计划

具体的分析过程可以参考这里,里面的例子描述的很清晰。

、索引优化

1、选择索引

(1)选择合适的索引列,选择在where,group by,order by,on从句中出现的列作为索引项,对于离散度不大的列没有必要创建索引。

(2)索引字段越小越好(因为数据库的存储单位是页,一页中能存下的数据越多越好 )

(3)离散度大得列放在联合索引前面

判断离散程度的方法是:

select count(distinct ziduan1),count(distinct ziduan2) from tablename
越大越离散

2、索引优化方法

索引一般情况下都是高效的。不过凡是都有两面性,索引是以空间换时间的一种策略,索引本身在提高查询效率的同时会影响插入、更新、删除的效率。不当的使用索引不仅增加了写操作的负担,也会影响读取的效率。索引越多,数据库分析的越慢。注意点:

(1)InnoDB 每个索引都会加上主键,联合索引不要加上主键,innodb会自动加,否则会冗余。

(2)索引存在的目的是为了加快查询的效率,不过不是索引越多越好,建立索引要适当才好。过多的索引会增加数据库判断使用什么索引来查询的开销,所以,有时候也会出现以去掉重复或者无效的索引为优化手段的优化方式。

(3)主键已经是索引了,所以primay key 的主键不用再设置unique唯一索引了。


3、索引的原理可以参考这里或者这里。理解索引原理对于索引优化有很大帮助。

、数据表结构优化

1、选择合适的数据类型
(1)使用可存下数据的最小的数据类型。

(2)使用简单地数据类型,int要比varchar类型在mysql处理上更简单。

(3)尽可能使用not null定义字段,这是由innodb的特性决定的,因为非not null的数据可能需要一些额外的字段进行存储,这样就会增加一些IO。可以对非null的字段设置一个默认值。

(4)尽量少用text,非用不可最好分表,将text字段存放到另一张表中,在需要的时候再使用联合查询,这样可提高查询主表的效率。

例子1、用int存储日期时间

from_unixtime()可将Int类型的时间戳转换为时间格式

select from_unixtime(1392178320); 输出为 2014-02-12 12:12:00unix_timestamp()可将时间格式转换为Int类型

select unix_timestamp('2014-02-12 12:12:00'); 输出为1392178320

例子2、存储IP地址——bigInt

利用inet_aton(),inet_ntoa()转换

select inet_aton('192.169.1.1'); 输出为3232301313

select inet_ntoa(3232301313); 输出为192.169.1.1

四、数据库配置优化

这方面目前了解的并不多,参考这里吧。

五、硬件优化

硬件层面的优化是最后的手段。主要需考虑CPU、存储、网络等几个方面。

CPU:CPU并不是越多越好,之前看到网上的分析有说很多的查询都是单CPU的,增加CPU数量并不能提高性能。

存储:机械磁盘 or SSD(当然是SSD更快);单个大磁盘 or 多个小磁盘组合使用(单个1T的磁盘应该没有2个500G磁盘的组合快,因为磁盘的转速都是固定的,两个磁盘相当于可以并行的读取)

网络:一般不是问题,但是在分布式的集群环境中,各个数据库节点之间的网络环境经常会称为系统的瓶颈。另外,如果服务端和数据库分布在不同的城市,一条简单SQL传输的时间可能就要几十毫秒。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle数据库优化是一个非常重要的工作,它可以提高数据库的性能,减少资源消耗,提升用户的使用体验。以下是一些常见的Oracle数据库优化方法: 1. 优化SQL语句 SQL语句是Oracle数据库的核心,优化SQL语句可以提高数据库的性能。可以通过以下方法来优化SQL语句: - 使用索引:索引可以提高SQL语句的执行效率,减少查询时间。 - 避免使用通配符:通配符(如“%”)会导致全表扫描,影响查询效率。 - 避免使用子查询:子查询会增加数据库的负担,影响查询效率。 2. 优化表结构 表结构的优化可以提高数据库的性能,减少数据库的资源消耗。可以通过以下方法来优化表结构: - 合理设计表结构:表结构的设计应该符合实际需求,避免冗余和重复数据。 - 选择合适的数据类型:合适的数据类型可以减少存储空间,提高查询效率。 - 分区表:分区表可以将大表分成若干个小表,提高查询效率。 3. 优化数据库参数 Oracle数据库有许多参数可以调整,优化这些参数可以提高数据库的性能。可以通过以下方法来优化数据库参数: - 调整SGA和PGA参数:SGA和PGA是Oracle数据库的关键参数,它们决定了数据库的性能。 - 调整I/O参数:I/O是Oracle数据库的瓶颈之一,通过调整I/O参数可以提高数据库的性能。 - 调整日志参数:日志是Oracle数据库的关键组成部分,通过调整日志参数可以提高数据库的性能。 4. 定期维护数据库 定期维护数据库可以减少数据库的资源消耗,提高数据库的性能。可以通过以下方法来维护数据库: - 清理无用数据:清理无用数据可以减少数据库的存储空间,提高查询效率。 - 统计表的数据:统计表的数据可以提高查询效率,减少数据库的资源消耗。 - 优化数据库备份:数据库备份是保障数据安全的关键,通过优化数据库备份可以减少数据库的资源消耗。 综上所述,Oracle数据库优化是一个复杂的工作,需要从多个方面入手,不断进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值