宝哥软件园

PHP数据库编程的MySQL优化策略概述

编辑:宝哥软件园 来源:互联网 时间:2021-09-03

本文简要介绍了PHP数据库编程的MySQL优化策略。分享给大家参考,如下:

前几天看了一篇文章说PHP的瓶颈不在PHP本身,而在数据库。众所周知,在PHP开发中,数据的添加、删除、修改和检查是核心。为了提高PHP的效率,程序员不仅要编写逻辑清晰、效率高的代码,还要优化查询语句。虽然我们对数据库的读写速度无能为力,但是借助memcache、mongodb、redis等一些数据库类扩展,PHP也可以实现更快的访问速度,所以学习这些扩展是非常必要的。本文首先讲一下MySQL常用的优化策略。

一些MySQL小技巧

1.SQL语句中的关键字最好用大写字母书写。首先,很容易区分关键词和操作对象。其次,在执行SQL语句时,MySQL会将其转换为大写。手动编写大写字母可以提高查询效率(尽管它很小)。2.如果我们在数据库中添加或删除数据行,数据标识会太大。使用更改表名自动增量=N,这样自添加的标识将从N. 3开始计数。向int类型添加ZEROFILL属性可以自动补充数据。4.导入大量数据时,最好在插入数据之前先删除索引,然后再添加索引。否则,mysql将花费大量时间更新索引。5.当创建一个数据库来编写sql语句时,我们可以创建一个带有后缀的文件。集成开发环境中的sql,它将识别sql语法,并使其更容易编写。更重要的是,如果数据库丢失了,还可以找到这个文件,并在当前目录下使用/path/Mysql-uusername-ppass word databasename filename . SQL执行整个文件的SQL语句(注意-u和-p后面是用户名和密码,没有空格)。

数据库设计中的优化

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

2.选择数据类型的优先级:int date、timeenum、char varchar blob。选择数据类型时,请考虑替换它。例如,通过使用ip2long()函数进行存储,可以将ip地址转换为unsign int类型。

3.对于char(n)类型,当数据完整时,n值应该尽可能小。

4.使用分区命令对单个表进行分区可以大大提高查询效率。MySQL支持RANGE、LIST、HASH和KEY分区类型,其中最常用的是RANGE,分区方式为:

创建tabletablename {}引擎innodb/myisam charset utf8//选择数据库引擎,并编码PARTITION BY RANGE/LIST(列)、//partition by range和预定义列表。分区部分名称值小于/in (n)。//命名分区并详细限制分区范围。5.选择数据库引擎时要注意innodb和myisam的区别。

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

索引优化

1.innodb是一个聚集索引。存储索引时,它必须有一个主键。如果未指定,引擎将自动生成隐藏的主键和主索引。主键的物理地址存储在索引中,数据由主键存储。每次使用索引时,必须先找到主索引,然后再找到主索引下的数据。

优点是通过主键查找非常快,缺点是二级索引会变慢,因为需要先通过二级索引(这是一级索引的位置。)找到主索引,然后通过主索引找到数据。而且如果主键不规则,在插入新值时需要移动更多的数据块,会影响效率。因此,有必要使用规则递增的int类型作为主键。此外,由于数据紧接在主键之后,如果数据中存在数据量较大的列(text/blob),innodb查询时会跳过很多数据块,也会导致速度变慢。

2.myisam的Index所有的索引都是一样的,统一指向磁盘上所有行的地址,都是轻量级的指针数据。缺点是每个索引的建立都不是通过主键,查询不如通过聚集索引找到主键快。但是,因为地址是存储的,所以插入新值时比较会发生变化。

3.多条件查询时,Mysql在执行sql查询时只会选择最接近的索引来使用,所以如果需要多条件查询,就要建立联合索引,即使会造成数据冗余。

为联合索引建立BTREE的方法:索引第一个条件,在第一个索引的BTREE区域中索引第二个条件,以此类推。因此,在使用索引时,第一个条件和第二个条件都不会用于联合索引。使用索引时,条件应该是有序的,并且应该使用序列。

4.索引长度对查询也有很大的影响。我们应该尽最大努力构建一个短的索引长度,并且我们可以使用查询列

从tablename中选择count(distinct left(column))/count(*),以测试索引列时选择的不同长度,以及索引的覆盖率。让我们选择n个接近饱和的长度来创建索引更改表表名添加索引(第(n)列)。索引一列的前n个字符。如果前n个字符相同,我们甚至可以反转并存储字符串,然后构建索引。

5.频繁修改导致索引碎片的维护方法:更改表名引擎旧引擎;即再次应用表存储引擎,使其自动维护;您也可以使用OPTIMIZE tablename命令进行维护。

数据查询优化

数据库操作应该是尽可能少的查询。当有查询时,数据操作不应该尽可能在数据库级进行,而是应该将数据返回到PHP脚本中进行操作,从而减轻数据库的压力。

一旦发现数据库性能问题,应该及时解决。一般来说,慢查询日志用于记录“慢”的语句,解释用于分析查询和索引使用情况,概要用于分析执行语句时的特定资源消耗。

慢速查询日志:

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

Slow_query_log_file=/path //设置日志存储路径long_query_time=n //set如果语句执行时间达到n秒,将被记录

2.然后在MySQL中设置SET slow_query_log='ON '开始慢速查询。

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

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

解释语句

使用方法在要用解释执行的查询语句之前

解释选择*来自用户;得到如下所示的结果:

以下是每个项目的说明:

Id查询语句的id,简单的查询没有意义,在多个查询中可以看到执行查询的顺序。select-type是执行的查询语句的类型,对应于多个查询,如simple/primary/union。tabel查询语句查询的数据表类型获取数据的类型。常见的类型效率从高到低依次为nullconsteq _ refrangeindexall capability-key : index key used index key _ len index len len length ref使用哪一列与索引一起从表中选择。Rows找出要扫描的数据的大概行数,我们可以看到索引的优缺点。extra通常在查询数据后使用filesort对文件进行排序,速度较慢。它需要优化索引。使用where读取整行数据,然后判断它是否满足where条件。使用index覆盖它,即它已经在traction中存储了目标数据,并直接读取索引,速度非常快。

一种新型的协调控制方案

使用SELECT @ @ frofiling检查配置文件的打开状态。如果未打开,请在SET profiling=1时打开它。打开后执行查询语句,MySQL会自动记录档案信息。使用show profiles查看所有sql信息,结果是Query_ID Duration Query,即查询ID、时间和使用的sql语句。我们可以用

Show PFrofile [type [,type]][for qu Rey query _ id][limit rwo _ count[offset offset]]类型通常包括ALL BLOCK IO、CPU、MEMORY等

大型存储中的优化

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

1.主服务器记录二进制日志中的变化,从服务器将主服务器的二进制复制到其中继日志中,并将数据再次返回到自己的数据中,从而复制主服务器的数据。

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

2.配置主服务器

修改my.ini/my.conf

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

3.配置从属服务器

Log-bin=mysql-bin //启用二进制日志服务器-id=226 //唯一服务器id

4.在主服务器上授权从属服务器

在*上授予复制从属权限。*到从属服务器上使用的由“根”5标识的“从属名称”@“IP”

将master更改为master_host='masterip ',master_user='masteruser ',master _ password=' masterpasswd

6.然后使用start slave命令启动主从复制。

不要忘记在每次配置修改后重新启动服务器,然后使用“显示主/从状态”查看主服务器和从服务器上的主/从状态。

数据库读写分离的实现依赖于MySQL中间件,如mysql_proxy、atlas等。通过配置这些中间件,使主从服务器在读写上相互分离,让从服务器承担被读取的责任,从而减轻了主服务器的负担。

数据库碎片

当数据库中数据表的数据量很大时,无论是索引还是缓存都有很大的压力,因此数据库被硬化为存储在多个数据库服务器或表中,以减轻查询压力。

有垂直分割、水平分割和联合分割。

垂直分区:当数据表较多时,对数据库中关系密切的表进行分区(比如同一个模块,经常连接到query),放在不同的主从服务器上。

水平分区:当表不多,表中数据量很大时,为了加快查询速度,可以通过哈希等算法将一个数据表分成若干个表,放在不同的服务器上,加快查询速度。水平分区和数据表分区的区别在于它们的存储介质。

联合分区:在更多的情况下,数据表和表中的数据非常大,因此需要联合分区,即同时进行垂直和水平分区,将数据库划分为分布式矩阵进行存储。

这些数据库优化方法每一种都可以写成一篇文章,深刻而深刻。了解并记住这些方法可以在必要时进行有目的的选择和优化,从而达到数据库的高效率。

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

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

希望本文对PHP编程有所帮助。

更多资讯
游戏推荐
更多+