php相关总结1

1,双引号和单引号的区别
1)双引号解释变量,单引号不解释变量
2)双引号里插入单引号,其中单引号里如果有变量的话,变量解释
3)双引号的变量名后面必须有一个非数字、字母、下划线的特殊字符,或者用变量括起来,否则会将变量后面的部分当做一个整体,引起语法错误
4)双引号解释转义字符,单引号不解释转义字符,但是解释'\和\\
5)能使单引号字符尽量不要使用双引号字符,单引号的效率比双引号要高(因为双引号要先遍历一遍,判断里面有没有变量,然后再进行操作,而单引号则不需要判断)


2,常用的超全局变量
1)$_GET ---get传输
2)$_POST ---post传输
3)$GLOBALS ---所有变量都放在这里面
4)$_REQUEST ---包含get和post的传输
5)$_FILE ---上传文件使用
6)$_SESSION ---会话控制时候会用
7)$_COOKIE ---回话控制时会用
8)$_SERVER ---系统环境变量


3,HTTP中POST/GET/PUT/DELETE方式的区别
HTTP定义了与服务器交互的不同方法,最基本的是POST/GET/PUT/DELETE,与其他比不可少的URL的全称是资源描述符,我们可以这理解
:url描述了一个网络上资源,而POST/GET/PUT/DELETE 就是对这个资源的增、删、改、查的操作


3.1)表单中get和post的提交方式的区别
1)get是把参数数据队列加到提交表单的action属性所指的url中,值和表单内各个字段一一对应,从url中可以看到;
 post是通过HTTPPOST机制,将表单内各个字段与其内容防止在HTML的head中一起传送到action属性所指的url地址,用户看不到这个过程。
2)对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据
3)get传送的数据量较小,post传送的数据量较大,一般被默认不受限制,但在理论上,IIS4中最大为80kb,IIS5中为1000k,get安全性非常低,post安全性较高。
3.2)
1)GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改、增加数据,
 不会影响资源的内容,即该请求不会产生副作用。无论进行多少次操作,结果都是一样。
2)与GET不同的是,PUT请求是向服务器端发送数据的,从而改变信息,该请求就像数据库的update操作一样,用来修改数据的内容,
 但是不会增加数据的种类等,也就是说无论进行多少次PUT操作,其结果并没有不同.
3)post请求同put请求类似,都是向服务器发送数据的,但是该请求会改变数据的种类等资源,就像数据库的insert操作一样,会创建新的内容,几乎目前所有的提交操作都是POST请求的。
4)DELETE请求顾名思义,就是用来删除某一个资源的,该请求就像数据库的delete操作
4,Php介绍
Hypertext Perprocessor --- 超文本预处理器
Personal Home Page 原始名称
目标用途:允许web开发人员快速编写动态生成的web页面,与其他页面相比,php是将程序嵌入到html文档中去执行,效率比完全生成HTML编写的CGI高很多
HTML: Hypertext Markup Language
创始人:拉姆斯勒'勒多夫,1968年生,加拿大滑铁卢大学.勒多夫最开始是为了维护个人网页,用prel语言写了维护程序,之后又用c进行了重写,最终衍生出php/fi
时间轴:
1)1995.06.08将php/fi公开释出
2)1995 php2.0,加入了对Mysql的支持
3)1997 php3.0
4)2000 php4.0
5)2008 php5.0
6)2015 php7.0
常见的IDE(Intergrated Development Environment):集成开发环境:
1)PHPStrom
2)Adobe Dreamweaver
3)NetBeans
常见的文本编辑器,具备代码高亮:
1)NotePad++
2)SublimeTexts
5,PHP优势
php特性:
1)php独特混合了C,java,Prel以及PHP自创的语法
2)可以比CGI或者Perl更快速的去执行动态网页,与其他编程语言相比,PHP是将程序嵌入到HTML文档中去执行,执行效率比完全生成HTML编辑的CGI要高很多,所有CGI都能实现
3)几乎支持所有流行的数据库及操作系统
4)PHP可以用C,C++进行程序的扩展
PHP优势:
1)开放源代码
2)免费性
3)快捷性
4)跨平台
5)效率高
6)图形处理
7)面向对象
8)专业专注
php技术应用:
1)静态页面生成
2)数据库缓存
3)过程缓存
4)div+css w3c标准
5)大负荷
6)分布式
7)flex
8)支持MVC
9)smarty模块引擎
6,echo/print_r/print/var_dump之间的区别
1)echo/print是php语句,var_dump和print_r是函数
2)echo输出一个或多个字符串,中间以逗号隔开,没有返回值是语言结构而不是真正的函数,因此不能作为表达式的一部分使用
3)print也是php的一个关键字,有返回值只能打印出简单的变量值,如果字符串显示成功则返回true,否则返回false
4)print_r 可以打印出复杂类型变量的值(如数组,对象)以列表的形式显示,并以array/object开头,但print_r输出布尔值和NUll的结果没有意义,因此var_dump()函数更适合调试
5)var_dump()判断一个变量的类型长度,并输出变量的数值
7,HTTP状态码分类
1)1**--信息,服务器收到的请求,需要请求者继续执行操作
2)2**--成功,操作被成功接收并处理
3)3**--重定向,需要进一步的操作以完成请求
4)4**--客户端错误,请求包含语法错误或者无法完成请求
5)5**--服务器错误,服务器在处理请求的过程中发生了错误


8,什么是魔术引号
魔术引号是一个将自动将进入PHP脚本的数据进行转义的过程,最好在编码时不要转义在运行时根据需要而转义
9,如何获取客户端ip(要求取得一个int)和服务器ip的代码
客户端:$_SERVER['REMOTE_ADDR'];或者 getenv('REMOTE_ADDR') ip2long进行转换
服务器端:gethostbyname('www.baidu.com')
10,使用哪些工具进行版本控制
git、svn
11,优化数据库的方法
1)选取最常使用的字段属性,尽可能减少定义字段宽度,尽量把字段设置NOTNULL,例如'省份'、'性别'最好使用ENUM
2)使用join代替子查询
3)使用联合(union)来代替手动创建的临时表
4)事务处理
5)锁定表、优化事务处理
6)适用外键,优化锁定表
7)建立索引
8)优化查询语句
12,是否使用过模本引擎?使用的模板引擎的名字是?
smarty,tp,ci,yii
13,对于大流量网站,采用什么方法来解决访问量的问题
1)确认服务器是否能够支持当前流量
普通的p4服务器一般最多能支持每天10万独立IP,如果访问量比这个还要大,那么必须首先配置一台更高性能的专用服务器才能解决问题,否则怎么优化都不能彻底解决性能问题
2)数据库读写分离,优化数据表
前台实现完全的静态化当然最好,可以完全不用访问数据库,不过对于频繁更新的网站,静态化往往不能满足某些功能
缓存技术就是另外一个解决方案,就是将动态数据储存到缓存文件中,动态网页直接调用这些文件,而不必再访问数据库,wordpress和z-blog都大量使用这种缓存技术,如果确实
无法避免对数据库的访问,那么可以尝试优化数据库的查询SQL,避免使用 select * from 这样的语句,每次查询只返回自己需要的结果,避免短时间内的大,尽量做到'所查即所得'
遵循以小表为主,附表为辅,查询条件先索引,先小后大的原则,提高查询效率量sql查询
3)程序功能规则,禁止外部的盗链
外部网站的图片或者文件盗链往往会带来大量的负载压力,因此应该严格限制外部对于自身的图片或者文件盗链,好在目前可以简单的通过refer控制盗链,apache自己可以通过配置来禁止
盗链.
4)控制大文件下载
大文件的下载会占用很大流量
5)使用不同主机分流主要流量
14,语句include和require的区别是什么?为避免多次包含同一个文件,可以用(?)语句代替他们
1)require是无条件包含,也就是如果一个流程里加入require,无论条件成立与否都会先执行require,当文件不存在或者无法打开的时候,会报错,并且会终止程序执行。
2)include有返回值,而require没有(可能因为如此require的速度比include快),如果被包含的文件不存在的话,那么会提示一个错误,但是程序还会执行下去
注意:包含文件不存在或语法错误的时候require是致命的,而include不是
3)require_once表示了只包含一次,避免了重复包含
15,谈谈mvc的认识?
由模型、视图、控制器完成的应用程序,由模型发出要实现的功能到控制器,控制器接收组织功能传递给视图
16,说明php中传值与传值引用的区别,并说明传值什么时候引用?
变量默认总是传值赋值,那也就是说,当将一个表达式的值赋予一个变量时,整个表达式的值被赋值到目标变量,
这意味着:当一个变量的赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量
php也提供了另外一种方式给变量赋值:引用赋值,这意味着新的变量简单的__引用了原始变量.改变的新的变量将影响到原始变量,反之亦然,使用引用变量,简单的将一个&符号加到要赋值的变量前
补充:
传值  -> 是把实参的值赋值给形参,那么对形参的修改,不会影响实参的值
传地址-> 是传值的一种特殊方式,只是他传递的是地址,不是普通的如int,那么传地址以后,实参和形参指向同一个对象。
传引用-> 真正的以地址的方式传递参数,传递以后,形参和实参都是同一个对象,只是他们名字不同而已,对形参的修改将影响到实参的值

17,isset、empty、is_null的区别
isset判断变量是否定义或者是否为空
变量存在返回true,否则返回false
变量定义不赋值返回false
unset一个变量,返回false
变量赋值为null,返回false
empty:判断变量的值是否为空,能转换为false的都为空,为空返回true,反之返回false
"",0,"0",null,false都认为为空,返回true
没有任何属性的对象都认为是空
is_null:检测传入的值(值、变量、表达式)是否为null
定义了,但是赋值为null
定义了,但是没有赋值
unset一个变量
18,前端调试的工具
1)fire fox的firebug
2)chrome的开发工具
3)emmet
4)json格式校验工具
19,简单描述mysql中,索引、主键、唯一索引、联合索引的区别,对数据库的性能有什么影响(从读写两方面)
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),他们包含着对数据表里所有记录的引用指针.
普通索引(由关键字key或index定义的索引)的唯一任务是加快数据的访问速度
普通索引允许被索引的数据列包含重复的值,如果能确定某个数据将只包含彼此不同的值,在这个数据列创建索引的时候就应该用关键字union
列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引,也就是说,唯一索引可以保证数据记录的唯一性。
主键,是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字PRIMARY KEY 来创建。
索引可以覆盖多个数据列,如像INDEX(columnA,columnB)索引,这就是联合索引
索引可以极大的提高数据的查询速度,但是会降低插入,删除,更新表的数据,因为在执行这些写操作时,还要操作索引文件
20,数据库中的事务是什么?
事务(transaction)是作为一个单元的一组有序的数据库操作,如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,
事务也不会成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程,如果一个操作失败,则事务将回滚,该事务所有操作
的影响都将取消,
ACID四大特性:原子性、隔离性、一致性、持久性
21,了解xss攻击吗?如何防止
XSS是跨站脚本攻击,首先是利用跨站脚本漏洞以一个特权模式去执行攻击者的脚本,然后利用不安全的Activex控件执行恶意的行为
使用htmlspecialchars()函数对提交的内容进行过滤,使字符串里面的特殊字符实体化
XSS攻击分成两类:
1)一类是来自内部的攻击,主要指的是利用程序自身的漏洞,构造跨站语句,如:dvbbs的showerror.asp存在的跨站漏洞
2)另一类则是来自外部的攻击,主要指的自己构造XSS跨站漏洞网页或者寻找非目标机以外有跨站漏洞的网页,如当我们要渗透一个站点,我们自己构造一个跨站漏洞的网页,然后构造跨站语句,通过结合其它技术,如社会工程学等,欺骗服务器的管理员打开。
XSS分为:储存型和反射型
1)储存型XSS:储存型XSS,持久化,代码是储存在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候出发代码执行,这种XSS比较危险,容易造成蠕虫,盗窃cookie
2)反射型XSS:非持久化,需要欺骗用户自己去点击链接才能出发XSS代码(服务器中没有这样的内容和页面),一般容易出现在搜索页面
防范措施:XSS漏洞是web应用程序中最常见的漏洞之一,如果您的站点没有预防XSS漏洞的固定方法,那么就存在XSS漏洞,
这个利用XSS漏洞的病毒之所以具有重要意义是因为,通常难以看到XSS漏洞的威胁,而该病毒则将其发挥到淋漓尽致
1)恶意用户,在一些公共区域(例如:建议提交表单或消息公共板的输入表单)输入一些文本,这些文本被其他用户看到,但这些文本不仅仅是他们要输入的文本,同时还包括一些可以在客户端执行的脚本,如:
<script>this.document="***"</script>
2)恶意提交这个表单
3)其他用户看到这个包括恶意脚本的页面并执行,获取用户的cookie等敏感信息
22,SQL注入漏洞产生的原因?如何防止?
SQL注入产生的原因:程序开发过程中不注意规范书写的sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行
防止SQL注入的方式:
1)开启配置文件中的magic_quotes_gpc和magic_quotes_runtime设置
2)执行sql语句时使用addslashes进行sql语句转换
3)sql语句书写尽量不要省略双引号和单引号
4)过滤掉sql语句中的一些关键词:update、insert、delete、select
5)提高数据库表和字段的命名技巧,对一些重要的字段根据程序的特点命名,取不易被猜到的
6)Php配置文件中设置register_globals为off,关闭全局变量注册
7)控制错误信息,不要在浏览器上输出信息,将错误信息写到日志文件中
23,php网站的主要攻击方式有哪些?
1)命令注入(Command Injection)
2)eval注入(Eval Injection)
3)客户端脚本攻击(Script Insertion)
4)跨网站脚本攻击(Cross Site Scripting,XSS)
5)SQL注入攻击(SQL Injection)
6)跨网站请求伪造攻击(Cross Site Request Forgeries,CSRF)
7)Session回话劫持(Session Hijacking)
8)Session固定攻击(Session Fixation)
9)HTTP响应拆分攻击(HTTP Response Spliting)
10)文件上传漏洞(File Upload Attack)
11)目录穿越漏洞(Directory Traversal)
12)远程文件包含攻击(Remote Inclusion)
13)动态函数注入攻击(Dynamic Variable Evaluation)
14)URL 攻击(URL attack)
15)表单提交欺骗攻击(Spoofed Form Submissions)
16)HTTP请求欺骗攻击(Spoofed HTTP Requests)
24,框架中什么是单一入口和多入口,单一入口的优缺点?
1)多入口就是通过访问不同的文件来完成用户请求,单一入口指web程序所有请求都指向一个脚本文件的。
2)单一入口更容易控制权限,方便对http请求可以进行安全检查.缺点:URL看起来不那么美观,特别是对搜索引擎来说不友好。
25,对于关系型数据库而言,索引是相当重要的概念,请回答有关索引的几个问题:
1)索引的目的是什么?
1)快速访问数据表中的特定信息,提高检索速度
2)创建唯一索引,保证数据库表中每一行数据的唯一性
3)加速表和表之间的连接
4)使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间
00 3)为数据表建立索引的原则有哪些?
1)在最频繁使用的、用以缩小查询范围的字段上建立索引.
2)在频繁使用的、需要排序的字段上建立索引
4)什么情况下不宜建立索引?
1)对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引
2)对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等
26,简述MYSQL数据库中MYISAM和InoDB的区别;
区别于其他数据库的最重要的特点就是其插件式的储存引擎,切记:储存引擎是基于表的,而不是数据库.
InnoDB储存引擎:
主要面向OLTP(Online Transaction Processing在线事务处理,是第一个完整支持ACID事务的储存引擎(BDB第一个支持事务的储存引擎,已经停止开发))
特点:
1)行琐设计、支持外键
2)支持类似于Oracle风格的一致性非琐定读(默认情况下读取操作不会产生琐)
3)InnoDB将数据放在一个逻辑的表空间中,由InnoDB自身进行管理。从MYSQL4.1版本开始,可以将每个InnoDB储存引擎的表单单独存放到一个独立的ibd文件中
4)InnoDB通过使用MVCC(多版本并发控制:读不会阻塞写,写也不会阻塞读)来获得高并发性,并且实现了SQL标准的4中隔离级别(默认为REPEATABLE级别)
5)InnoDB还提供了插入缓存(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read)
MyISAM储存引擎:
是Mysql官方提供的储存引擎,主要面向OLAP(Online Analytical Processing,在线分析处理)方面的应用
特点:
1)不支持事务,支持表琐和全文索引,操作速度快。
2)MyISAM储存引擎有MYD和MYI用来存放数据文件,MYI用来存放索引文件.Mysql数据库只缓存其索引文件,数据文件的缓存交给操作系统本身来完成
Mysql5.0版本开始,Myisam默认支持256T的表单数据
27,解释Mysql外连接、内连接与自身连接的区别
先说什么是交叉连接:交叉连接又叫笛卡尔积,它是指不适用任何条件,直接将一个表的所有记录和另外一个表中的所有记录一一匹配
内连接:指的是有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合条件的记录不会出现在结果集中,即内连接只连接匹配的行
外连接:其结果集中不仅包含符合连接条件的行,而且还会包括左表、右表或两个表中的所有数据行,这三种情况依次称之为左外连接,右外连接,和全外连接
左外连接,也称左连接(左查询),左表为主表,左表中的所有记录都会出现在结果集中,对于那些右表中并没有匹配的记录,依然要显示
右边对应的那些字段值以NULL来填充、右外连接,也称右连接,右表为主表,右表中的所有记录都会出现在结果集中。左连接和右连接可以互换,Mysql目前还不支持全外连接.
28,什么是面向对象?主要特性是什么?几大原则是什么?
面向对象是程序的一种设计模式,它利于提高程序的可重用性,使程序机构更加清晰.
主要特征是:封装、继承、多态
封装:服务提供者把它服务的细节隐藏掉,你只需要提交请求与传递它需要的参数,他就会给你返回结果.
五大基础原则:
1)单一责任原则:
单一责任的意思就是一个类而言:它需要做的事情就一件,这一件事可以是拆分的很细的一件事(
例如:一台电脑,显示器就是显示用的,键盘就是打字用的,usb接口就是连接用的等等)
2)开放封闭原则:
一个类、模块、函数等应该对于扩展是开放的,但是对于修改是封闭的,简单说就是当你的系统要升级维护需要对原有的代码进行修改时,可能会将错误引入到了原来的旧代码中,因此,
在软件升级维护时,应该尽可能的通过扩展的方式而不是修改原有的代码,虽然在实际开发中,修改原本的代码跟扩展代码都是同时存在的,
但是为了程序的可扩展性,在制作初期,应该遵循开闭原则。
3)接口隔离原则
接口隔离的目的就是将庞大的接口拆分成更小的或者说更具体的接口,使得系统的耦合度大大降低,从而容易重构,修改等。
4)依赖倒置原则
其实依赖倒置原则就是告诉你,不要让你的程序耦合度过高
在依赖倒置原则中有几个关键点:
1)高层模块不应该直接依赖底层模块,两者应该依赖其抽象
2)抽象不应该依赖细节
3)细节应该依赖抽象
5)替换原则
29,什么是静态路由,其特点是什么?什么是动态路由,其特点是什么?
静态路由是由系统管理员设计与构造的路由表规定的路由,适用于网关数量有限的场合,而且网络拓扑结构不经常变化的网络,
其缺点是不能动态的适用网络状况的变化,当网络状况变化后必须由网络管理员修改路由表。
动态路由是由路由选择协议而动态构建的,路由协议之间通过交换各自所拥有的路由信息实时更新路由表的内容.动态路由可以自动学习网络拓扑解雇,并更新路由表,其缺点是不能动态的适用网络状况的变化
是路由广播更新信息将占据大量的网络带宽。
30,使用过Memcache缓存吗,如果使用过,能够简单的描述下它的工作原理吗?
Memcache是把所有的数据保存在内存当中,采用hash表的方式,每条数据由key和value组成,每个key是独一无二的,当要访问某个值的时候先找到值,然后返回结果
Memcache采用LRU算法来逐渐把过期的数据清除掉。
31,列举流行的ajax框架,说明ajax实现原理及json在ajax中起什么作用?
流行的ajax框架有jquery、prototype、dojo、mootools
ajax的工作原理是一个页面的指定位置可以加载另一个页面所有输出内容,这样就实现了一个静态页面也能获取到数据库中的返回信息了,
所以ajax技术实现了一个静态网页在不刷新整个页面的情况下与服务器通信,减少了用户等待时间,同时也从而降低了网络流量,增强了客户体验的友好程度。
在使用ajax时,涉及到数据传输,即将数据从服务器返回到客户端,服务器和客户端分别使用不同的脚本语言处理数据,这就需要一种通用的格式,XML和json就是最常用的两种,而json比xml更简单。
32,mysql中事务回滚机制概述
事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤销。
要同时修改数据库中的两个不同表时,如果他们不是一个事务的话,当第一个表修改完,可能第二个表修改过程中出现了异常而没能修改,此时就只有第二个表依旧是
未修改之前的状态,而第一个表已经被修改完毕,而当你把他们设定为一个事务的时候,当第一个表修改完,第二表修改出现异常没能修改,第一个表和第二个表都要回到未修改的状态,这就是所谓的事务回滚。

 
MYSQL查询优化
一,简介
二,截取SQL语句
三,查询优化基本分析命令
四,查询优化几个方向
五,索引优化
1)索引优点
2)索引缺点
3)索引选择
4)索引细究
六,子查询优化
七,等价谓词重写
八,条件化简与优化
九,外连接优化
十,其他查询优化

简介:
一个好的web应用,最重要的一点是有着优秀的访问性能,数据库MYSQL是web应用的组成部分,也是决定其性能的重要部分,所以提升MYSQL的性能至关重要.
MYSQL性能的提升可分为三部分,包括硬件、网络、软件。其中硬件、网络取决于公司的财务,这里就不多说了。软件又细分为很多种,在这里我们通过mysql的查询优化从而达到性能的提升.
截取SQL语句:
1)全面查询日志
2)慢查询日志
3)二进制日志
4)进程列表
SHOW FULL PROCESSLIST;
查询优化基本分析命令:
1)EXPLAIN {PARTITIONS|EXTENED}
2)SHOW CREATE TABLE;
3)SHOW INDEX FROM tab;
4)SHOW TABLE STATUS LIKE 'tab'
5)SHOW [GLOBAL|SESSION] STATUS LIKE '';
6)SHOW VARIABLES
查询优化几个方向:
1)尽量避免全文扫描,给相应字段增加索引,应用索引来查询
2)删除不用或重复的索引
3)查询重写,等价转换(谓词,子查询,连接查询)
4)删除内容重复不必要的语句,精简语句
5)整合重复执行的语句
6)缓存查询结果
索引优化
1)索引优点
1)保持数据的完整性
2)提高数据的查询性能
3)改进表的连接操作(join)
4)对查询结果进行排序,没索引将会采用内部文件排序算法进行排序,效率较慢
5)简化聚合数据操作
2)索引缺点
1)索引需要占用一定的储存空间
2)数据插入、更新、删除时会受索引的影响,性能降低。因为数据变更索引也需要进行变更
3)多个索引,优化器需要耗时则优选择
3)索引选择
1)数据量大时采用
2)数据高度重复时,不采用
3)查询取出数据大于20%,将采用全文扫描,不要索引
索引细究
不建议在查询的时候使用select * from 进行查询,应该写需要用的字段,并且增加相应的索引,以提高查询性能.
等价谓词重写
1) BETWEEN AND 改写为 >=,<=之类的。实测:十万条数据,重写前后时间,1.45s/0.06s
2) in 转换多个or. 字段为索引时,两个都能用到索引,or效率相对in好一点
3) name like 'abc%' 改写成 name>=' abc' and name <' abd';
条件化简与优化
1)将where、having(不存在groupby和聚集函数时)、join-on条件能合并的尽量合并
2)删除不必要的括号,减少语法分析的or和and树层,减少cpu消耗
3)常量传递,a=b and b=2 转换为 a=2 and b=2.尽量不使用变量a=b或a=@var_dump
4)消除没用的SQL条件
5)where等号右边尽量不出现表达式计算;where中不要对字段进行表达式计算、函数的适用。
6)恒等变换、不等式变换。例:测试百万级数据 a>b and b>10 变为a>b and a>10 and b>10优化显著
其他查询优化
1)以下将会造成放弃索引查询,采用全文扫描
1)where子句中适用!=或<>操作符,注意:主键支持,非主键不支持
2)避免适用or
经测试,并非适用了or就一定不能适用索引,大多数情况下是没用到索引,但还有少数情况是用到的,因此具体情况具体分析。
类似优化:
select * from tab where name='aa' or name='bb';
=>
select * from tab where name='aa' union all select * from tab where name='bb'
实测:
1.十万数据测试,没有任何索引的情况下,上面比下面的查询速率快一倍
2.三十万数据测试,aa与bb都单独索引情况下,下面的查询效率比or快一点
3)避免使用not in 
not in一般不能适用索引,主键字段可以
4)where中尽量避免使用对null的判断
5)like不能前置百分号 like '%.com'
解决:
1)若必须使用%前置,且数据长度不大,例如URL,可以将数据翻转存入数据库,再来查.like reverse‘%。com’
2)使用覆盖索引
6)使用索引字段作为条件的时候,假若是符合索引,则应该使用索引最左边前缀的字段名
2)将exists代替in
select num from a where num in(select num from b)
select num from a where exists(select 1 from b where num = a.num)
一百万条数据,筛选59417条数据用时6.65s、4.18。没有做其他优化,仅仅只是将exists替换in
3)字段定义是字符串,查询时没带引号,不会用索引,将会进行全文扫描.
4)尽量使用表变量来代替临时表
5)避免频繁创建和删除临时表,以减少系统表资源的消耗
6)如果使用到了临时表,在储存过程的最后务必将所有的临时表显示删除,先truncate table,然后 drop table,这样可以避免系统表的较长时间锁定
7)尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写
8)大数据量,若数据量过大,应该考虑相应需求是否合理
9)尽量避免大事务操作,提高系统并发能力


MYSQL
pro_dish 菜品表

id name
1 木耳
2 红薯
3 茼蒿

pro_dish_standard 菜品规格表

id dish_standard_name dish_id
1 木耳(整) 1
2 木耳(半份) 1
3 红薯(整份) 2
4 羊肉 null

SQL 语句的常用三种连接查询:

1,内连接(inner join 或 join)
内连接是等值连接,它使用"=,>,<,<>"等运算符根据每个表共有的列的值匹配两个表中的行
查询语句:
select * from pro_dish pd inner join pro_dish_standard pds on pd.id = pds.dish_id

查询结果如下:
id name id1 dish_standard_name dish_id
1 木耳 1 木耳(整) 1
1 木耳 2 木耳(半份) 1
2 红薯 3 红薯(整份) 2
内连接只会查询出,两个表中有关联关系的数据。

2,左连接(left join 或 left outer join)
左连接又称左向外连接,查询的结果集包括SQL语句中左表所有行,右表中匹配的行。
如果左表中的某行在右表中没有匹配行,则用空值表示。如果左表数据,在右表中有多行匹配,则查询结果左表为多行显示

查询语句:
select * from pro_dish pd left join pro_dish_standard pds on pd.id = pds.dish_id

查询结果如下:
id name id1 dish_standard_name dish_id
1 木耳 1 木耳(整) 1
1 木耳 2 木耳(半份) 1
2 红薯 3 红薯(整份) 2
3 茼蒿 null null null

3,右连接(right join 或 right outer join)
右连接也成右向外连接,查询的结果集包括SQL语句中右表的所有行,左表中匹配的行,如果右表的某行在左表中没有匹配的行,则左表数据为空

查询语句:
select * from pro_dish pd right join pro_dish_standard pds on pd.id = pds.dish_id

查询结果:
id name id1 dish_standard_name dish_id
1 木耳 1 木耳(整) 1
1 木耳 2 木耳(半份) 1
2 红薯 3 红薯(整份) 2
null null 4 羊肉 null

猜你喜欢

转载自blog.csdn.net/a369405354/article/details/79386862
今日推荐