mysql编程_PHP数据库编程之一MySQL优化策略概述

647c868a18a3b6602332f7ac3961700f.png

本文简单讲述了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 属性可以对数据进行自动补0

4、导入大量数据时最好先删除索引再插入数据,再加入索引,不然,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最为常用,分区方式为:

CREATE TABLE tablename{
}ENGINE innodb/myisam CHARSET utf8 //选择数据库引擎和编码
PARTITION BY RANGE/LIST(column),//按范围和预定义列表进行分区
PARTITION partname VALUES LESS THAN /IN(n),//命名分区并详细限定分区的范围

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

EXPLAIN SELECT * FROM user;

得到形如下图的结果:

b691b4e28882abf1ae705eaec80b8d69.png

下面是对每一项的解释:

id 查询语句的id,简单查询无意义,多重查询时可以看出执行查询的顺序

select-type 执行的查询语句的类型,对应多重查询,有simple/primary/union等。

tabel 查询语句查询的数据表

type 获得数据的类型 常见的类型效率从高到低为 null>const>eq_ref>ref>range>index>all

possible-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语句。

我们可以使用

SHOW PFROFILE [type[,type]][FOR QUREY Query_ID][Limit rwo_count [OFFSET offset]]

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=102 //服务器唯一ID

3、配置从服务器slave

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

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

GRANT REPLICATION SLAVE ON *.* to 'slavename'@'IP' identified by 'root'

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方面的技术点很多,也是因为太多了,实在是写不过来,写过来了大家也不会看的太多,所以我这里把它整理成了PDF和文档,如果有需要的可以

点击进入暗号: PHP+「平台」

f46234fbfd088e94d7ab0a48cd1c2a70.png

027d5893ddb44fd602501f17f3c6eb06.png

更多学习内容可以访问

阿布阿布:【对标大厂】精品PHP架构师教程目录大全,只要你能看完保证薪资上升一个台阶(持续更新)​​zhuanlan.zhihu.com

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的 PHP技术交流群

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql六:数据备份、pymysql模块

阅读目录 一 MySQL数据备份 二 pymysql模块 一 MySQL数据备份 #1. 物理备份&#xff1a; 直接复制数据库文件&#xff0c;适用于大型数据库环境。但不能恢复到异构系统中如Windows。 #2. 逻辑备份&#xff1a; 备份的是建表、建库、插入等操作所执行SQL语句&#xff0c;适用于中…

测试程序运行时间

在初步学习算法的时候&#xff0c;都喜欢一个词叫优化算法&#xff0c;经常做的事情就是比较两个实现同种功能的程序的运行时间。测试运行时间的函数&#xff0c;这就来安利一波。 1.时间函数头文件 #include<time.h> 2.设置初始时间和结束时间的变量。 int begin,end; d…

python权重初始值设置_pytorch自定义初始化权重的方法

在常见的pytorch代码中&#xff0c;我们见到的初始化方式都是调用init类对每层所有参数进行初始化。但是&#xff0c;有时我们有些特殊需求&#xff0c;比如用某一层的权重取优化其它层&#xff0c;或者手动指定某些权重的初始值。核心思想就是构造和该层权重同一尺寸的矩阵去对…

Vim案列掌握vim的基本操作——案例一:vim创建编写txt文件

案例一:vim创建编写txt文件 1.vim创建test.txt文件 vim test.txt 2.输入i,I,a,A,o,O,r,R均可&#xff08;这里以i为例&#xff09; 3.保存文件并退出vim。 a.先返回到一般模式 Esc b.冒号切换到命令行模式 : c.保存文件 :w d.退出vim :q successful 退回界面后可以再次…

Lagom学习 四 CompletionStage

Future: Java 8 之前的 Java 版本功能较弱&#xff0c;仅支持两种用法&#xff1a;要么检查 future 是否已经完成&#xff0c;要么等待 future 完成; Java 8 增加了 CompletableFuture<T> 类&#xff0c;它实现了新的 CompletionStage<T> 接口&#xff0c;并对 Fut…

网络定位-能定位到国家省份市区县街道

代码改变世界 直接上代码 package com.example.baidu;import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast;import com.baidu.location.BDLocation; …

Vim功能键整理(图片来自mooc)

1.一般模式 2.编辑模式 3.命令行模式

rpn风险等级评价准则_2019一建经济学习重点:技术方案经济效果评价

2019年一级建造师备考正在进行中&#xff0c;你是在看教材还是在刷题呢&#xff1f;今天优路教育小编是来送干货的&#xff0c;教材太厚&#xff0c;知识点太乱&#xff0c;那就来看这里的考点总结吧。接下来小编带大家一起学习《工程经济》第一章工程经济。一建《工程经济》第…

Android编程之页面跳转整理(只涉及关键步骤,需要有一定的基础,小白学习勿入)

自我学习篇: 1.创建你需要的页面&#xff0c;这里演示以创建一个主页和一个 子页进行跳转作为参考。 2.编写layout&#xff0c;这里仅需要创建一个按钮即可&#xff0c;至于样式美观大家可以根据需要进行自我调整。 这里需要注意的是对id的修改&#xff0c;自己应该起一个相对…

电脑无法打开特定网页_监理检测网校电脑微信无法打开公路试验检测视频课程的处理方法...

电脑版微信安装后&#xff0c;通过微信中置顶的监理检测网校公众号&#xff0c;菜单进入网校课程有的人会出现课程打不开&#xff0c;直接打开的是浏览器&#xff0c;无法学习&#xff0c;处理方法如下&#xff1a;电脑上打开微信&#xff0c;左下角三横线图标点开 &#xff0c…

PHP和MySQL Web开发pdf

下载地址&#xff1a;网盘下载内容简介 本书将PHP开发与MySQL应用相结合&#xff0c;分别对PHP和MySQL做了深入浅出的分析&#xff0c;不仅介绍PHP和MySQL的一般概念&#xff0c;而且对PHP和MySQL的Web应用做了较全面的阐述&#xff0c;并包括几个经典且实用的例子。作者…

python stringstrip方法详解_Python 基础知识全篇-字符串(Strings)

字符串是字符的集合。单引号和双引号字符串可以包含在单引号或双引号中。my_string "This is a double-quoted string."my_string This is a single-quoted string.这种灵活的方式可以让我们在字符串中包含引号。quote "Linus Torvalds once said, Any progr…

Linux环境下创建运行.java文件

1.下载安装jdk。 一条yum指令就可以搞定了,也可以自己从windows上共享文件进行操作&#xff0c;有些复杂&#xff0c;这里不做详细描述。 以后熟练了&#xff0c;可能进行二更。 yum install java-1.8.0-openjdk* -y 这里需要注意是需要你转换到自己的root权限的 su root 截图…

JAVA核心技术卷2:高级特征(原书第8版)

下载地址&#xff1a;网盘下载内容简介 Java领域最有影响力和价值的著作之一&#xff0c;由拥有20多年教学与研究经验的资深Java技术专家撰写&#xff08;获Jolt大奖&#xff09;&#xff0c;与《Java编程思想》齐名&#xff0c;10余年全球畅销不衰&#xff0c;广受好评。…

python处理teradata数据库_Python脚本连接Teradata数据库

Connect Teradata frompythonBaseon Linux Ubuntu with python2.7参考网络搜索结果&#xff0c;具体出处不记得了&#xff0c;结合自身实践总结。以下操作为Linux环境&#xff0c;其他环境请自行调整。(中英文结合是因为这个总结最初也是受惠于歪果仁的分享)1, Install python …

Linux下的Shell编程之Helloworld.sh看过来

1.编写HelloWorld.sh vim HelloWorld.sh 2.按下i进行编辑 里面的代码如下: #!bin/sh echo "hello world!" 然后Esc退出编辑模式 然后:wq保存并退出vim 小白看参考: 小白vim指令学习 3.运行HelloWorld.sh&#xff08;方式有两种&#xff09; a.sh HelloWorld.sh …

python数据录入和分析_hive+python数据分析入门

本文作者系 leanote 的核心开发者, 多谢关注leanote. leanote官网, leanote github为什么要使用hivepython来分析数据举个例子,当年没有数据库的时候, 人们通过编程来操作文件系统, 这相当于我们编写mapreduce来分析数据.后来有了数据库, 没人再操作文件系统了(除非有其它需求)…

Linux下删除非空文件目录

删除目录大家第一反应应该和我一样都是rmdir 但今天有一个目录里因为配置有好多文件直接烦死&#xff0c;不能rmdir直接删除&#xff0c;要是使用这个指令还要先用cd指令转换到该目录下一个个删除&#xff0c;实在是有点麻烦&#xff0c;最后终于还是找到了正确的打开方式。 …

python不同版本共存_多版本Python共存的配置方法

同一台PC中&#xff0c;如果同时安装Python2和Python3环境&#xff0c;会在执行python命令时出现错误&#xff0c;操作系统会找到默认的配置进行执行。怎么样才能让python2和python3一起工作又互相不影响呢。但是由于工作需要&#xff0c;我们的个人PC上可能需要多个python版本…

jdk1.8配置(自我速成)

1.JAVA_HOME 变量名字:JAVA_HOME 变量值:找到自己安装jdk的目录即可&#xff0c;有的教程路径到了bin&#xff0c;但其实到不到都可以。 2.CLASSPATH 变量名:CLASSPATH 变量值&#xff1a; .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar 注意这里那个英文的点点不要少了…