数据性能优化

来源:互联网 发布:三星的笔记本电脑知乎 编辑:程序博客网 时间:2024/05/22 00:09

web 优化过程中瓶颈网在数据库,尽管我们尽量使用一些机制来避免数据库访问,但在一些情况下我们仍旧需要访问数据库

 1.缓存的创建和过期后重建

 2.数据库写操作

 3.没有使用缓存机制

通过时用mysqlreport 我们可以较为清晰的查看当前数据库的状态

索引

定义

通过目录直接找到内容的方式,在数据库中称为索引。

副作用

如果查找的记录占据整个数据表的很大比例,那么使用索引扫描反而性能更差。

索引高效的原因

索引本身的数据结构(Mysql使用BTree、Hash以及RTree)觉定了他们拥有非常高效的查找算法。

索引分类

普通索引、唯一索引、主键索引、全文索引等

 

我们可以通过explain 来查看sql 语句运行状况,查看是否使用索引

组合索引对于一些查询会产生误导,因为组合索引的基本原则是“最左前缀”

key1,key2,key3的组合索引

SELECT * FROM goods WHERE key1=k1 ORDER BY key2,key3 符合 效率好

SELECT * FROM goods WHERE key2=k2 不符合 效率差

总之不是量身定做的组合索引反而会给查询带来更大的负担

 

因为数据库还会按照索引进行查询

Innodb与MyISAM数据库的区别在于....<待定>

 

可以用慢查询分析工具可以查看慢查询sql

 

索引缓存

数据表的索引也可以缓存起来,它是放在内存中,索引可以在内存中查找,不需要访问磁盘

MyISAM 表

frm 存储表的结构信息

MYD 存储表中的数据

MYI 存储表中的索引

 

由于存在索引缓存机制,MyISAM对于索引的写操作必然存在延迟,这是为了减少磁盘访问,但是如果数据库崩溃的时候有些索引没有来的及写入磁盘,将会丢失索引,从而导致数据表损坏,Mysql 可以尽量弥补,但是数据表的数量有5位数,修复不是很轻松了,而Innodb采用预写日志方式来实现事物,也就是只有当事务日志写入磁盘后财更新数据和索引,这样即便数据库崩溃,也可以通过事务日志恢复数据和索引。

 

索引的代价

1.索引会占据很大的磁盘空间,有的时候可能会比数据本身更大。

2.数据的更新,每次的关键字段更新都要引发索引的本身的更新,对于update、delete都会引发索引的更新,一旦涉及索引字段的变更就会索引的计算,导致更多的时间开销。

时间开销的计算时间和查询前的等待时间。

 

减少表锁定等待

MyISAM 的表锁定可以允许多个线程同时读取数据,select查询不需要锁等待,所有的select 都要等update结束才能开始。

 

Inoodb采用行锁定 对不update和select来自不同的线程,并且针对不同的记录行,所以他们可以轻松的并发执行,这就是行锁定的优点。

行锁定的价值在并不在于它本身的绝对速度,而是存在于特定的应用场景中。

行锁定缺点

select 查询语句,where条件中的count字段并没有索引,所以这里只能进行全盘扫描,对于Inoodb的行锁定,扫描需要额外的开销。


事务表的性能

Inoodb支持事务,Inoodb通过预写日志的方式实现事务,当有事务提交时Inoodb首先将它写到内存中的事务日志缓冲区,随后当事务日志写入磁盘时,Inoodb才更新实际数据和索引。关键点是事务日志何时写入磁盘。

 

开启查询缓存

mysql采用的机制是,当一个数据表有更新操作(update、insert)后,那么涉及这个表的所有查询缓存都会失效。

由此可以得出结论“更新少的表可以进行缓存”


反范式化

对于需要进行反范式化的操作,可以避免昂贵的join查询

 

对于数量的统计可是使用memcacheDB优化

memcacheDB是memcache于Berkeley的结合。


原创粉丝点击