位置: 编程技术 - 正文

PHP数据库编程之MySQL优化策略概述(使用php进行mysql数据库编程的基本步骤)

编辑:rootadmin

推荐整理分享PHP数据库编程之MySQL优化策略概述(使用php进行mysql数据库编程的基本步骤),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:数据库php干嘛的,数据库php干嘛的,php中数据库怎么设计,php数据库设计,php操作数据库的五个步骤,php中数据库怎么设计,php数据库教程,php操作数据库代码,内容如对您有帮助,希望把文章链接给更多的朋友!

本文简单讲述了PHP数据库编程之MySQL优化策略。分享给大家供大家参考,具体如下:

前些天看到一篇文章说到PHP的瓶颈很多情况下不在PHP自身,而在于数据库。我们都知道,PHP开发中,数据的增删改查是核心。为了提升PHP的运行效率,程序员不光需要写出逻辑清晰,效率很高的代码,还要能对query语句进行优化。虽然我们对数据库的读取写入速度上却是无能为力,但在一些数据库类扩展像memcache、mongodb、redis这样的数据存储服务器的帮助下,PHP也能达到更快的存取速度,所以了解学习这些扩展也是非常必要,这一篇先说一下MySQL常见的优化策略。

几条MySQL小技巧

1、SQL语句中的关键词最好用大写来书写,第一易于区分关键词和操作对象,第二,SQL语句在执行时,MySQL会将其转换为大写,手动写大写能增加查询效率(虽然很小)。2、如果我们们经对数据库中的数据行进行增删,那么会出现数据ID过大的情况,用ALTER TABLE tablename AUTO_INCREMENT=N,使自增ID从N开始计数。3、对int类型添加 ZEROFILL 属性可以对数据进行自动补、导入大量数据时最好先删除索引再插入数据,再加入索引,不然,mysql会花费大量时间在更新索引上。5、创建数据库书写sql语句时 ,我们可以在IDE里创建一个后缀为.sql的文件,IDE会识别sql语法,更易于书写。更重要的是,如果你的数据库丢失了,你还可以找到这个文件,在当前目录下使用/path/mysql -uusername -ppassword databasename < filename.sql来执行整个文件的sql语句(注意-u和-p后紧跟用户名密码,无空格)。

数据库设计方面优化

1、数据库设计符合第三范式,为了查询方便可以有一定的数据冗余。

2、选择数据类型优先级 int > date,time > enum,char>varchar > blob,选择数据类型时,可以考虑替换,如ip地址可以用ip2long()函数转换为unsign int型来进行存储。

3、对于char(n)类型,在数据完整的情况下尽量较小的的n值。

4、在建表时用partition命令对单个表分区可以大大提升查询效率,MySQL支持RANGE,LIST,HASH,KEY分区类型,其中以RANGE最为常用,分区方式为:

5、选择数据库引擎时要注意innodb 和 myisam的区别。

存储结构:MyISAM在磁盘上存储成三个文件。而InnoDB所有的表都保存在同一个数据文件中,一般为2GB事务支持:MyISAM不提供事务支持。InnoDB提供事务支持事务。表锁差异:MyISAM只支持表级锁。InnoDB支持事务和行级锁。全文索引:MyISAM支持 FULLTEXT类型的全文索引(不适用中文,所以要用sphinx全文索引引擎)。InnoDB不支持。表的具体行数:MyISAM保存有表的总行数,查询count(*)很快。InnoDB没有保存表的总行数,需要重新计算。外键:MyISAM不支持。InnoDB支持

索引方面优化

1、innodb是聚簇索引,存储索引时必须有主键,如果没有指定,引擎会自动生成一个隐藏的主键,生成一个主索引,索引内存放的是主键的物理地址,数据靠主键存放,每次使用索引时要先找到主索引,然后找到主索引下的数据。

优点通过主键查找特别快,缺点是次级索引会变慢,因为需要先通过次级索引(次级索引里是主索引的位置。)找到主索引,然后通过主索引找数据。并且如果主键无规律,插入新值时需要移动较多数据块,会影响效率,所以要尽量使用有规律递增的int型做主键。还有因为数据紧跟着主键放,所以如果数据中有数据量特别大的列(text/blob),innodb查询时会跳过很多数据块,也会导致慢。

2、myisam的索引各个索引都相同统一指向磁盘上各个行的地址,都是轻量级的指针数据。缺点是各个索引的建立不是通过主键,查询没有聚簇索引查找主键快。但其因为存储的是地址,所以在插入新值时比较方面移动改变。

3、进行多条件查询时,对多条件分别建立索引时,执行sql查询时,MySQL只会选择一个最贴近的索引来使用,所以如果需要多条件查询,要建立联合索引,即使会造成数据冗余。

联合索引的BTREE建立方法:对第一个条件建立索引,在第一个索引的BTREE区域对第二个条件建立索引,以此类推,所以,在使用索引时,不用第一个条件用第二个条件也不会用到联合索引。使用索引时要条件要有顺序,有序列的使用。

4、索引长度对查询也有很大影响,我们应该尽量建立短的索引长度,我们可以使用查询列

SELECT COUNT(DISTINCT LEFT(column)) / COUNT(*) FROM tablename 来测试对column列建立索引时选取不同的长度,索引的覆盖率有多大,我们选择一下接近饱和的n个长度来建立索引 ALTER TABLE tablename ADD INDEX (column(n)); 来对某一列的前n个字符建立索引。若前n个字符相同,我们甚至可以对字符串进行反转存储,然后建立索引。

5、对于经常修改导致的索引碎片的维护方式:ALTER TABLE tablename ENGINE oldengine;即再次应用一下表存储引擎,使其自动维护;也可以用 OPTIMIZE tablename 命令来进行维护。

数据查询方面优化

数据库操作尽量少查询,有查询时尽量不在数据库层面上进行数据操作,而是返回到PHP脚本中操作数据,减轻数据库压力。

一旦发现有数据库性能问题,要及时解决,一般用慢查询日志记录查询很"慢"的语句,用EXPLAIN分析查询和索引使用情况,用PROFILE分析语句执行时的具体资源消耗。

慢查询日志:

1、在my.ini或my.cnf的[mysqld]下添加

slow_query_log_file=/path //设置日志存储路径long_query_time=n //设置如果语句执行时间达到n秒,就会被记录下来

2、然后在MySQL里设置SET slow_query_log='ON'来开启慢查询。

3、记录下日志后,我们用/bin/目录下的mysqldumpslow filename来查看日志,其常用参数如下:

-g pattern 使用正则表达式-t n返回前n条数据-s c/t/l/r 以记录次数/时间/查询时间/返回记录数来排序

EXPLAIN语句

使用方法,在要执行的查询语句前面加EXPLAIN

PHP数据库编程之MySQL优化策略概述(使用php进行mysql数据库编程的基本步骤)

得到形如下图的结果:

下面是对每一项的解释:

id 查询语句的id,简单查询无意义,多重查询时可以看出执行查询的顺序select-type 执行的查询语句的类型,对应多重查询,有simple/primary/union等。tabel 查询语句查询的数据表type 获得数据的类型 常见的类型效率从高到低为 null>const>eq_ref>ref>range>index>allpossible-keys:可能使用到的索引key 使用到的索引key_len索引长度ref 使用哪个列与索引一起从表中选择。rows 查找到数据要扫描的大概行数,可看出索引的优劣extra 常见的有using filesort 查询到数据后进行文件排序,较慢,需要优化索引using where 读取整行数据后进行判断过滤,是否符合where条件using index 索引覆盖,即在牵引中已经有这存储了目标数据,直接读取索引,很快。

PROFILE

用SELECT @@frofiling来查看PROFILE的开启状态。如果未开启,用SET profiling=1来开启。开启之后,再执行查询语句,MySQL会自动记录profile信息。应用show profiles查看所有的sql信息,结果为 Query_ID Duration Query三列结果,分别是查询ID,用时和所用的sql语句。我们可以使用

type常见有ALL(全部) BLOCK IO(显示IO相关开销) CPU(CPU开销) MEMORY(内存开销)等

大型存储方面优化

数据库主从复制和读写分离

1、master将改变记录到二进制日志中,slave将master的二进制拷贝到它的中继日志中,重新将数据返回到它自己的数据中,达到复制主服务器数据的目的。

主从复制可以用作:数据库负载均衡、数据库备份、读写分离等功能。

2、配置主服务器master

修改my.ini/my.conf

[mysqld]log-bin=mysql-bin //启用二进制日志server-id= //服务器唯一ID

3、配置从服务器slave

log-bin=mysql-bin //启用二进制日志server-id= //服务器唯一ID

4、在主服务器上授权从服务器

5、在从服务器上使用

change master to master_host="masterip",master_user="masteruser",master_password="masterpasswd";

6、然后使用start slave命令开始进行主从复制。

不要忘记在每次修改配置后重启服务器,然后可以在主从服务器上用show master/slave status查看主/从状态。

实现数据库的读写分离要依赖MySQL的中间件,如mysql_proxy,atlas等。通过配置这些中间件来对主从服务器进行读写分离,使从服务器承担被读取的责任,从而减轻主服务器的负担。

数据库的sharding

在数据库中数据表中的数据量非常庞大的时候,无论是索引还是缓存等压力都很大,对数据库进行sharding,使之分别以多个数据库服务器或多个表存储,以减轻查询压力。

方式有垂直切分、水平切分和联合切分。

垂直切分:在数据表非常多的时候,把数据库中关系紧密(如同一模块,经常连接查询)的表切分出来分别放到不同的主从server上。

水平切分:在表不多,而表里的数据量非常大的时候,为了加快查询,可以用哈希等算法,将一个数据表分为几个,分别放到不同的服务器上,加快查询。水平切分和数据表分区的区别在于其存储介质上的不同。

联合切分:更多的情况是数据表和表中的数据量都非常大,则要进行联合切分,即同时进行垂直和水平分表,将数据库切分为一个分布式的矩阵来存储。

这些数据库的优化方式,每一种拿出来都可以写作一篇文章,可谓是博大精深,了解并记忆了这些方式,可以在有需要的时候进行有目的的选择优化,达到数据库效率的高效。

接下来我们会进一步总结一下常用的PHP数据库类扩展memcache、redis和mongodb的基本使用场景和使用方式。

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php+mysql数据库操作入门教程》、《php+mysqli数据库程序设计技巧总结》、《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

PHP数据库操作二:memcache用法分析 本文实例讲述了PHP数据库操作之memcache用法。分享给大家供大家参考,具体如下:在一个高并发的web应用中,数据库存取瓶颈一直是个大问题,一旦达到

PHP数据库操作三:redis用法分析 本文实例讲述了PHP数据库操作redis用法。分享给大家供大家参考,具体如下:memcache虽然好用,解决了数据库遇到高并发时的IO问题,但还有很多问题丞

PHP数据库操作四:mongodb用法分析 本文实例讲述了PHP数据库mongodb用法。分享给大家供大家参考,具体如下:传统数据库中,我们要操作数据库数据都要书写大量的sql语句,而且在进行无

标签: 使用php进行mysql数据库编程的基本步骤

本文链接地址:https://www.jiuchutong.com/biancheng/287504.html 转载请保留说明!

上一篇:PHP回调函数与匿名函数实例详解(php 函数返回值)

下一篇:PHP数据库操作二:memcache用法分析(php数据库编程)

  • 金税四期对纳税的影响
  • 公司向公司借款可以无息吗
  • 哪些行业不能开具增值税专用发票
  • 缴纳增值税和附加税
  • 增值税加附加税加企业所得税加印花税是多少个税点
  • 租赁房屋增值税
  • 固定资产折旧提完了之后还要怎么处理吗
  • 17%增值税发票怎么计算成13%
  • 固定资产累计折旧完了怎么办
  • 如何确认增值税纳税义务发生时间
  • 关于转让费的问题
  • 企业核税需要什么资料
  • 办公室租赁合同需要交哪些税额?
  • 地税没报税怎么办
  • 企业的其他账簿怎么做
  • 部队属于企事业单位吗
  • 一般纳税人注销公司流程2023
  • 企业不合规发票责令补开处理
  • 收到公司投入的土地使用权
  • 财务管理和会计学哪个好就业
  • 个人股权转让印花税在哪里申报
  • 需要缴纳消费税的委托加工存货,由受托方
  • 三种测试网速的方法
  • 从银行提取备用金填制什么凭证
  • 房产税存在往期未申报信息怎么处理
  • 经营租赁方式租入分录
  • 会计分录中结转是什么意思
  • 应收账款补贴
  • 冲减预付账款会计分录
  • 台式电脑清洗步骤图解
  • php常用的设计模式在开发中的实例
  • 计提增值税可以无付凭证吗
  • 会计核算的方法主要有
  • laravel实战教程
  • 库存现金总分类账怎么登记
  • 所得税分配表分录怎么写
  • 建筑工程甲方公司
  • PyTorch 深度学习实战 | DIEN 模拟兴趣演化的序列网络
  • 学前端的可以是什么专业的
  • 增资会计
  • saas web
  • 无法支付其他应用怎么办
  • 所有者权益合计等于什么
  • phpcms 用的是什么模板引擎
  • html元素一般分为哪几类
  • 税前利润弥补是什么意思
  • 新公司成立需要刻哪些章
  • sql里面union 和union all区别
  • 收到质量赔款涉税处理
  • 金税四期可以查香港银行卡吗
  • mysql的存储引擎有哪些,区别是什么
  • 用人单位性质怎么填
  • 同一控制下企业合并
  • 发给客户免费的短信
  • 固定资产多入账怎么写情况说明
  • 偿债基金专户
  • 信用证保证金到期怎么处理
  • 对公转账需要填写开户行吗
  • 发票认证完了该怎么取消
  • 应收账款平均余额公式
  • 在windows xp中说法正确的是
  • centos和rhel
  • 桌面上家庭组图标是干嘛
  • 电脑因故障出现问题而启动
  • 双系统其中一个系统无法开机
  • cocos怎么用
  • linux find命令的使用
  • python如何精确小数
  • unity碰撞得分代码
  • win10 putty
  • css美化表单 案例
  • unity3d初学者教程视频
  • 安卓解析xml的几种方式
  • js全局变量怎么定义
  • 电子税务局怎么添加开票员
  • 如果快递没有按时发货东西变质怎么办
  • 四川地方税务 副局长 晓宏
  • 长沙税务注销公示期是多久
  • 小规模纳税人30万免税政策
  • 白酒消费税怎么计算
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设