优化页面访问速度(二) ——数据库优化

优化页面访问速度(二)

——数据库优化

一、概述

数据库优化,主要包括数据表设计、索引、sql语句、表拆分、数据库服务器架构等方向的优化。

二、数据库设计

在建表的时候,就需要考虑到将来的使用场景,尽量在建表初期就设计好。

1、存储引擎

Mysql常被提到的存储引擎就是InnoDB和MySIAM,其实现在主要都在用InnoDB了。两者的区别:

InnoDB支持事务,索引和数据存在一个文件,主键查询速度快(主键就是索引B+树的叶子节点,而数据就绑定在叶子节点),行级锁,支持外键,恢复起来较快。

MySIAM不支持事务,支持全文索引,表级锁, 索引和数据文件分开存放。

InnoDB在众多方面都优于MySIAM,且MySIAM的全文索引其实可以使用其他工具来实现,故常用InnoDB引擎。

另外,如果两个表的引擎不一样,一个是MySIAM另一个是InnoDB,则事务的恢复只会恢复InnoDB的表,这样的事务并不完整,故要求所有的表都是InnoDB。

2、字段

1)字符串

定长的字符串用char比较好,这样修改的时候不会产生碎片,而且利用率高。相对来说,varchar则用于长度不一致的字段。

2)枚举

对于只有几种值的字段,用枚举的效果更好。表示状态的字段,常常可以这么设计。枚举在mysql底层,会转成int存储,效率很高。另外,保存的时候,建议不要直接用1、2这种,可以用英文来表示不同的状态,比较好辨认。

3)数字

不需要负数的时候,可以加上unsigned;需要精确的小数才考虑decimal。

三、索引

索引可以加快查找速度,但是对于增删改,还需要去维护对应的B+树,因此索引是按需设置,不能乱加。

InnoDB的索引,分为主键索引和辅助索引。

1、主键索引

InnoDB的主键索引,是和数据绑定在一起的,因此按照主键来查找时,找到值的时候,也就找到了对应的数据,所以说InnoDB的主键索引查找速度特别快。

如下图所示:

另外可以看到,InnoDB引擎下,数据是绑定在主键的,故InnoDB引擎的表,必须要设置主键。

另外,建议设置逐渐增大的数字作为主键,且不要修改主键,这样避免主键的B+树旋转太多。

2、辅助索引

除了主键,其他的索引统称为辅助索引。其他的索引,是用其他的B+树来存储,子节点上存的是这一行对应的主键的信息。

故用辅助索引查找,找到对应的主键后,还需要去主键的B+树上查找,才可以找到对应的数据。

3、联合索引

当多个字段共同组成索引,则成为联合索引。联合索引需要遵循最左前缀原则。例如建立联合索引a_b_c。

下列语句是可以用到索引的:

Select * from xxx where a = ‘xx’ and b = ‘xx’ and c = ‘xx’;

Select * from xxx where a = ‘xx’ and b = ‘xx’;

Select * from xxx where a = ‘xx’;

Select * from xxx where a = ‘xx’ and b = ‘xx’ and c > ‘xx’;

Select * from xxx where a = ‘xx’ and b > ‘xx’;

Select * from xxx where a > ‘xx’;

下列语句是用不到索引的:

Select * from xxx where b = ‘xx’ and c = ‘xx’;

Select * from xxx where a > ‘xx’ and b = ‘xx’ and c = ‘xx’;

需要说明的是,前面一个字段用到的大于,则后面的字段无法用到索引。因为联合索引的存储是多个B+树的连接;1个字段的叶子节点接下一个字段的根节点。故如果出现大于,则后面的字段无法确定范围,即无法使用到索引。

4、唯一索引

唯一索引是辅助索引的一种,除了索引的功能,还能保证字段在数据库中是唯一的,这对于并发新增有防止重复的作用。

5、建索引注意事项

1)对于where、order by、group by,都可以考虑建索引。

2)索引建立在区分度大的字段上,对于性别这类的字段,建立索引没有意义。

3)对于字符串类型,可以考虑建立前缀索引,例如对于description字段的前7个字符建立索引,语句为:alter table xxtable add key (description(7));

四、SQL语句优化

1、尽量用到索引

1)避免在 where 子句中对字段进行 null 值、!=或<>、in 和 not in 、非打头字母like搜索、表达式操作或者函数操作,这些操作都会导致放弃索引,全表扫描。

2)or,左右两边都应该对索引的列进行查询,只要有一边的列不是索引列,就会导致放弃使用索引。可以考虑用union代替or,这样至少可以有一部分数据用到索引。

3)对于字符串类型,如果里面存的是数字,查询的时候也要记得加上引号,强制转成字符串,这样才能用到索引。

2、其他查询优化

1)如果不需要全量数据,可以考虑用limit。

2)避免用子查询,mysql的子查询,内部执行计划器是这样执行的:先查外表再匹配内表,而不是先查内表,当外表的数据很大时,查询速度会非常慢。

3)对于group by,MySQL对所有GROUP BY col1,col2...的字段进行排序。如果查询包括GROUP BY,想要避免排序结果的消耗,则可以指定ORDER BY NULL禁止排序。

五、表拆分

对于数据量太大的表,可以考虑拆分表,以减少扫描的数据量。

1、横向拆表

当数据量太大,且数据有一定的规律,则可以横向分表。例如交易明细表,可以根据用户id进行分表,把用户id进行hash,不同的hash结果对应到不同的表,再编写一个实现算法,根据id到对应的表进行增删改查即可。

2、纵向拆表

当有一些大字段,且这些字段并不是经常需要查询,则可以独立出一个表,例如文章表可以存文章的标题、概要、日期、关键词等,但是对于文章的具体内容,则可以独立一张表,这样文章列表页速度可以改善。

3、分区

分区是mysql自带的功能,其原理是将一个表的数据存在不同的文件中,由mysql根据内部规则,自动去对应的数据文件找数据。

六、数据库服务器架构

1、读写分离

商业应用上,数据库经常都是读写分离的,通常写在主库,读在从库进行。数据库的主从一致性,是通过中继日志实现的。

每当有数据修改,主库会将sql语句写入中继日志,然后从库会把日志搬到对应的从库日志,再逐条执行sql。

2、负载均衡

负载均衡,可以通过mycat等插件实现,可以理解为数据库是对底层存储文件的抽象,而Mycat是对数据库的抽象。

原文发布于微信公众号 - 爱思考的coder(phpthinker)

原文地址:https://www.cnblogs.com/zmdComeOn/p/11704921.html

时间: 2025-01-05 11:58:14

优化页面访问速度(二) ——数据库优化的相关文章

优化页面访问速度(一)——综述

优化页面访问速度(一) ——综述 一.概述 优化页面访问速度,首先需要了解用户在浏览器输入url后,最终是如何看到所需的页面.在了解整个流程后,可以逐个步骤进行优化. 二.从URL到页面 大致流程如下: 1.DNS服务器解析域名,并转成IP,返回给浏览器,浏览器直接通过IP来访问. 2.根据IP,通过各种网关.路由器.交换机,最终访问到代码所在的Nginx服务器上. 3.Nginx解析URL,对于js.css.图片等静态资源,直接找到对应文件并返回:如果是php文件,由于Nginx本身不会处理p

优化页面访问速度(三) ——服务端优化

优化页面访问速度(三) ——服务端优化 一.概述 服务端的优化,主要可以通过消息队列.减少数据库请求(缓存).并发处理.页面静态化等方式处理. 二.消息队列 1.解决问题 消息队列(Message Queue,MQ)有许多不同的实现方式,可以用rabbitmq.activemq.rocketmq,也可以用任务分发系统gearman. 消息队列主要是解决消息的异步发送,即对于某个系统不需要关心的内容,只需要发布一个处理完毕的消息,带上一些参数,有需要的系统自行订阅.例如一些任务执行完成的回调函数,

优化页面访问速度(四) ——前端优化

优化页面访问速度(四) ——前端优化 一.概述 前端的优化,主要可以通过减少HTTP请求.非实时请求改异步.缓存.文件压缩.CDN加速.独立图片服务器等. 二.减少HTTP请求 1.HTTP开销 HTTP请求,需要耗费资源,主要包括域名解析.建立TCP连接.发送请求.等待处理结果.下载资源.解析请求等. 因此,减少HTTP请求,利于优化页面访问速度. 2.图片地图 对于多个图片,如连续的几个按钮,每个按钮都是一个小图片.如果逐个加载图片,则需要发送多个请求,分别获取这些图片文件. 这里,可以将这

提高 SharePoint 页面访问速度之SQL优化

前面两篇文章我们和大家一起讨论到了SharePoint IIS的应用池回收,W3WP进程数和重置回收等方面的优化,今天来和大家讲讲后端SQL服务器的优化. 对于SQL的优化,今天主要介绍的就是两点,CPU的优化和内存的优化. 很多同学在装好SQL之后,其实并没有对内存优化进行设置,导致SQL的内存分配很不合理,针对于SharePoint,建议设置SQL的使用内存最少为 8192 MB,最多为 20480 MB 这个临界值. 如上设置,注意,这里的配置值和运行值一定要配置两次,并且要保证其一直,否

【转】加快网站访问速度——Yslow极限优化

Yslow是一套雅虎的网页评分系统,详细的列出了各项影响网页载入速度的参数,这里不做多说. 我之前就一直参考Yslow做博客优化,经过长时间的学习也算是有所收获,小博的YslowV2分数达到了94分(偶耶!),如果换用博客类小网站评分标准更是可以达到满分. 下面我就总结几点大家力所能及优化方法,分享给各位. 下面贴一下小博全新刷新的载入图,下面文章中用得到: 我认为网页优化主要分为两类,个人称之为软优化与硬优化.软优化主要包括:服务器缓存类与浏览器本地缓存类,这些优化主要是参数设置上的改动.而硬

HTML5移动开发之路(51)——jquerymobile中改善页面访问速度

本文为 兄弟连IT教育 机构官方 HTML5培训 教程,主要介绍:HTML5移动开发之路(51)--jquerymobile中改善页面访问速度 在使用jQuery Mobile进行开发的时候可以选择单页模版和多页模版,在使用单页模版的时候从一个页面跳转到另一个页面的时候需要从服务器请求,用户会感到略有停顿.使用多页模版,可以改善页面跳转之间的流畅性,但是多个页面要一次性下载,所以下载时间变长,用户体验也会受到影响. 在基于预取技术的开发中,当第一个页面的DOM对象加载完成后,jQuery Mob

提高 SharePoint 页面访问速度之 IIS 应用池回收

相信大家都有这样的体会,我们企业内部的 SharePoint 在使用了一段时间之后,都会有访问速度降低,页面访问速度缓慢的问题,除了服务器硬件瓶颈所导致的原因, 还有一些其他的原因,这些原因从各个层面对SharePoint 造成很多的干扰,今天我们就来说其中的一个,IIS应用池回收. SharePoint 在长期的运行过程当中,服务器内存中会存储很多缓存信息,以帮助下次用户访问时能够快速响应,但是这样的日积月累,也使得内存池承受了很大的压力, 从而形成臃肿的缓存区,那么为了减小服务的负担,IIS

提高 SharePoint 页面访问速度之&ldquo;暖场&rdquo;脚本

上一篇文章我们讲到了关于如果采用IIS应用池回收技术来提高SharePoint的页面访问速度,今天来给大家讲一个SharePoint圈儿内"著名"的暖场脚本(Warm-up-script). 所谓暖场脚本,顾名思义,就是在一切正式的表演之前,先来给大家暖暖场,不至于使得大家感觉到尴尬和不自在.同理,其实就是帮助SharePoint实现访问提速,不至于访问卡顿和缓慢. 不知道大家有没有这样的感受,每天早上来上班,会发现第一次打开SharePoint的速度很慢,之后会好很多,这是什么原因呢

小强的HTML5移动开发之路(51)——jquerymobile中改善页面访问速度

在使用jQuery Mobile进行开发的时候可以选择单页模版和多页模版,在使用单页模版的时候从一个页面跳转到另一个页面的时候需要从服务器请求,用户会感到略有停顿.使用多页模版,可以改善页面跳转之间的流畅性,但是多个页面要一次性下载,所以下载时间变长,用户体验也会受到影响. 在基于预取技术的开发中,当第一个页面的DOM对象加载完成后,jQuery Mobile会对标记data-prefetch的链接地址进行预取操作.预取的详细过程如下: 注意:使用预取功能时,不建议给所有链接都添加data-pr