PHP和MySQL爱考的10道题

来自《PHP程序员面试笔试宝典》,涵盖了近三年了各大型企业常考的PHP面试题,针对面试题提取出来各种面试知识也涵盖在了本书。

一、如何进行数据库优化?

数据库优化的过程可以使用以下的方法进行:

1)选取最适用的字段属性,尽可能减少定义字段长度,尽量把字段设置NOT NULL,例如'省份、性别',最好设置为ENUM。

2)使用连接(JOIN)来代替子查询。

① 删除没有任何订单客户:DELETE FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)。

② 提取所有没有订单客户:SELECT FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)。

③ 提高b的速度优化:SELECT FROM customerinfo LEFT JOIN orderid customerinfo. customerid=orderinfo.customerid WHERE orderinfo.customerid IS NULL。

3)使用联合(UNION)来代替手动创建的临时表。创建临时表:SELECT name FROM 'nametest' UNION SELECT username FROM 'nametest2'。

4)事务处理。保证数据完整性,例如添加和修改。同时,如果两者成立,则都执行,一者失败都失败:

mysql_query("BEGIN");

mysql_query("INSERT INTO customerinfo (name) VALUES ('$name1')";

mysql_query("SELECT * FROM 'orderinfo' where customerid=".$id");

mysql_query("COMMIT");

5)锁定表,优化事务处理。用一个SELECT语句取出初始数据,通过一些计算,用UPDATE语句将新值更新到表中。包含有WRITE关键字的LOCK TABLE语句可以保证在UNLOCK TABLES命令被执行之前,不会有其他的访问来对customerinfo表进行插入、更新或者删除的操作。

mysql_query("LOCK TABLE customerinfo READ, orderinfo WRITE");

mysql_query("SELECT customerid FROM 'customerinfo' where id=".$id);

mysql_query("UPDATE 'orderinfo' SET ordertitle='$title' where customerid=".$id);

mysql_query("UNLOCK TABLES");

6)使用外键,优化锁定表。把customerinfo里的customerid映射到orderinfo里的customerid,任何一条没有合法的customerid的记录不会写到orderinfo里。

CREATE TABLE customerinfo

(

customerid INT NOT NULL,

PRIMARY KEY(customerid)

)TYPE = INNODB;

CREATE TABLE orderinfo

(

orderid INT NOT NULL,

customerid INT NOT NULL,

PRIMARY KEY(customerid,orderid),

FOREIGN KEY (customerid) REFERENCES customerinfo

(customerid) ON DELETE CASCADE

)TYPE = INNODB;

注意:'ON DELETE CASCADE',该参数保证当customerinfo表中的一条记录删除的话同时也会删除order。

表中的该用户的所有记录,注意使用外键时要定义数据库引擎为INNODB。

二、选择正确的存储引擎?

在MySQL中有两个存储引擎:MyISAM和InnoDB,每个引擎都有利有弊。

MyISAM适合于一些需要大量查询的应用,但其对于有大量写操作的支持并不是很好。甚至只是需要update一个字段,整个表都会被锁起来,而其他进程,就算是读进程都无法操作直到读操作完成。另外,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的。

InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。但是它支持“行锁”,于是在写操作比较多的时候,会更优秀。并且,它还支持更多的高级应用,例如事务。

三、【真题231】 用什么方法检查PHP脚本的执行效率(通常是脚本执行时间)和数据库SQL的效率(通常是数据库query时间),并定位和分析脚本执行和数据库查询的瓶颈所在?

参考答案:检查PHP脚本的执行效率的方法如下:可以在检查的代码开头记录一个时间,然后在代码的结尾也记录一个时间,结尾时间减去开头时间取这个时间的差值,从而检查PHP的脚本执行效率,记录时间可以使用microtime()函数。

检查数据库SQL的效率的方法如下:可以通过explain显示MySQL如何使用索引来处理select语句及连接表,帮助选择更好的索引和写出更优化的查询语句。然后启用slow query log记录慢查询,通过查看SQL的执行时间和效率来定位分析脚本执行的问题和瓶颈所在。

四、 以下代码的运行结果为(    )。

<?php

mysql_connect('localhost','root',"");

$result = mysql_query("SELECT id,name FROM tb1");

while($row = mysql_fetch_array($result,MySQL_ASSOC)){

echo' ID:' .$row[0].' Name:' .$row[];

}

?>

A.报错    B.循环换行打印全部记录

C.无任何结果 D.只打印第一条记录

参考答案:A。

分析:因为代码中没有指明要操作的数据库名,所以会报错。

所以,本题的答案为A。

五、考虑如下数据表和查询如何添加索引能提高查询速度?(    )

CREATE TABLE MYTABLE (

ID INT,

NAME VARCHAR (100),

ADDRESS1 VARCHAR (100),

ADDRESS2 VARCHAR (100),

ZIPCODE VARCHAR (10),

CITY VARCHAR (50),

PROVINCE VARCHAR (2)

)

SELECT ID, VARCHAR FROM MYTABLE WHERE ID BETWEEN 0 AND 100 ORDER BY NAME, ZIPCODE

A.给 ID 添加索引

B.给 NAME 和 ADDRESS1 添加索引

C.给ID 添加索引,然后给 NAME 和 ZIPCODE 分别添加索引

D.给ZIPCODE 和 NAME 添加索引

参考答案:C。

分析:给ID字段设置索引能提高 where 条件执行的效率,给 NAME 和 ZIPCODE设索引则能使排序更快。

六、 如何高效操作MySQL?

MySQL对于PHP甚至是所有开发者都是非常基础和重要的模块,对于熟悉的LAMP体系架构,我们需要构建稳定可靠的系统,数据库环境是必不可少和关键的地方。在使用MySQL过程中,有以下建议:

1)使用InnoDB数据库引擎。MySQL常用的有MyISAM和InnoDB两种,MyISAM不支持外键约束或者事务处理。当插入或更新一条记录时,整个数据表都被锁定了,随着使用量的增加,性能会非常差。

2)使用MySQLi面向对象的数据库操作方法。PHP5支持了面向对象的访问数据库方法。具体的优点前面已经讲过,此处不再赘述。

3)对于用户输入进行验证。用户输入的内容是一个很大的变量之一,要防止SQL注入或黑客登录等安全隐患。

4)MySQL未使用utf-8字符集。utf-8字符集解决了很多国际化的问题,需要尽量使用此字符集,防止字符的问题出现。

5)通过SQL来替代PHP逻辑处理。通常来说,执行一个查询比在结果中使用PHP语言来迭代处理更有效率。所以,需要尽量通过SQL来替代PHP逻辑处理,提高效率。

6)优化数据库查询。几乎绝大部分PHP性能问题都是数据库引起的,经常出现的慢查询等SQL查询问题可能会让系统崩溃。需要对数据库进行优化查询。

7)要正确使用数据类型。

MySQL提供了诸如numeric、string和date等的数据类型。如果想存储一个时间,那么使用date或者datetime类型。如果这个时候用integer或者string类型,那么将会使得SQL查询非常复杂。

很多人倾向于擅自自定义一些数据的格式,例如,使用string来存储序列化的PHP对象。这样的话数据库管理起来可能会变得简单些,但会使得MySQL成为一个糟糕的数据存储而且之后很可能会引起故障。

8)不要在查询中使用“*”。这会返回表中所有数据,这是懒惰的表现,会在降低效率和出错概率上都大大提高。

9)合理使用索引技术。不使用或过度使用索引都会造成性能降低。如果在每个字段都加了索引,那么当执行修改操作时,索引都需要重新生成,会对性能影响较大。不使用索引,同样会造成全表查询,降低效率。使用索引一般性原则是这样的:select语句中的任何一个where子句表示的字段都应该使用索引。

10)记得备份。数据库必须进行备份,常见的有主从、主主数据库等系统架构形式。

七、【真题222】 以下说法正确的是(    )。

A.使用索引能加快插入数据的速度

B.良好的索引策略有助于防止跨站攻击

C.应当根据数据库的实际应用合理设计索引

D.删除一条记录将导致整个表的索引被破坏

参考答案:C。

分析:索引的作用主要是帮助数据库快速查找到对应的数据,并不能加快插入数据的速度,所以,选项A错误。

索引不能够帮助防止跨站攻击,所以,选项B错误。

创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。索引是占用物理空间的,所以在实际的应用中是要合理设计使用索引的。所以,选项C正确。

索引是一种表结构,删除一条数据也不会影响到整个表的索引,并且索引不一定是数字,也可以是字符串。所以,选项D错误。

八、如何对MySQL的系统内核优化?

大多数MySQL都部署在Linux系统上,所以,操作系统的一些参数也会影响到MySQL性能,以下参数的设置可以对Linux内核进行适当优化。

l  net.ipv4.tcp_fin_timeout = 30  #TIME_WAIT超时时间,默认是60s

l  net.ipv4.tcp_tw_reuse = 1  #1表示开启复用,允许TIME_WAIT socket重新用于新的TCP连接,0表示关闭

l  net.ipv4.tcp_tw_recycle = 1  #1表示开启TIME_WAIT socket快速回收,0表示关闭

l  net.ipv4.tcp_max_tw_buckets = 4096  #系统保持TIME_WAIT socket最大数量,如果超出这个数,系统将随机清除一些TIME_WAIT并打印警告信息

l  net.ipv4.tcp_max_syn_backlog = 4096  #进入SYN队列最大长度,加大队列长度可容纳更多的等待连接

在Linux系统中,如果进程打开的文件句柄数量超过系统默认值1024,就会提示“too  many files open”信息,所以,要调整打开文件句柄限制。

# vi /etc/security/limits.conf  #加入以下配置,*代表所有用户,也可以指定用户,重启系统生效

* soft nofile 65535

* hard nofile 65535

# ulimit -SHn 65535   #立刻生效

九、什么是数据库权限?

关于MySQL的权限简单的理解就是MySQL允许用户做权利以内的事情,不可以越界。例如只允许一个用户执行SELECT操作,那么它就不能执行UPDATE操作;只允许一个用户从某台机器上连接MySQL,那么它就不能从除那台机器以外的其他机器连接MySQL。

那么MySQL的权限是如何实现的呢?这就要说到MySQL的两阶段的验证,下面详细来介绍。第一阶段:服务器首先会检查是否允许连接。因为创建用户的时候会加上主机限制,可以限制成本地、某个IP、某个IP段以及任何地方等,只允许你从配置的指定地方登录。后面在实战的时候会详细介绍关于主机的限制。第二阶段:如果能连接,那么 MySQL 会检查发出的每个请求,看是否有足够的权限实施它。例如,要更新某个表或者查询某个表,MySQL会检查对某个表或者某个列是否有权限。再例如,要运行某个存储过程,MySQL会检查对存储过程是否有执行权限等。

MySQL权限控制原则:

1)只授予能满足需要的最小权限,防止用户干坏事。例如,用户只是需要查询,那就只给SELECT权限就可以了,不要给用户赋予UPDATE、INSERT或者DELETE权限。

2)创建用户的时候限制用户的登录主机,一般是限制成指定IP或者内网IP段。

3)初始化数据库的时候删除没有密码的用户。安装完数据库的时候会自动创建一些用户,这些用户默认没有密码。

4)为每个用户设置满足密码复杂度要求的密码。

5)定期清理不需要的用户。回收权限或者删除用户。

示例1:创建一个只允许从本地登录的超级用户feihong,并允许将权限赋予别的用户,密码为123。

GRANT ALL PRIVILEGES ON *.* TO feihong@'localhost' IDENTIFIED BY '123' WITH GRANT OPTION;

GRANT命令说明:

ALL PRIVILEGES 是表示所有权限,也可以使用SELECT、UPDATE等权限。

ON 用来指定权限针对哪些库和表。

*.* 中前面的*号用来指定数据库名,后面的*号用来指定表名。

TO 表示将权限赋予某个用户。

feihong@'localhost' 表示feihong用户,@后面接限制的主机,可以是IP、IP段、域名以及%,%表示任何地方。注意:这里%有的版本不包括本地,以前碰到过给某个用户设置了%允许任何地方登录,但是在本地登录不了,这个和版本有关系,遇到这个问题再加一个localhost的用户就可以了。

IDENTIFIED BY 指定用户的登录密码。

WITH GRANT OPTION 这个选项表示该用户可以将自己拥有的权限授权给别人。注意:经常有人在创建操作用户的时候不指定WITH GRANT OPTION选项,导致后来该用户不能使用GRANT命令创建用户或者给其他用户授权。

备注:可以使用GRANT重复给用户添加权限,权限叠加,例如,先给用户添加了一个SELECT权限,然后又给用户添加了一个INSERT权限,那么该用户就同时拥有了SELECT和INSERT权限。

示例2:创建一个网站用户(程序用户)。

创建一个一般的程序用户,这个用户可能只需要SELECT、INSERT、UPDATE、DELETE、CREATE TEMPORARY TABLES等权限,如果有存储过程还需要加上EXECUTE权限,那么一般是指定内网网段192.168.100网段。

GRANT USAGE,SELECT, INSERT, UPDATE, DELETE, SHOW VIEW ,CREATE TEMPORARY TABLES,EXECUTE ON 'test'.* TO webuser@'192.168.100.%' IDENTIFIED BY 123';

示例3:创建一个普通用户(仅有查询权限)。

GRANT USAGE,SELECT ON 'test'.* TO public@'192.168.100.%' IDENTIFIED BY  'test';

示例4:查看权限。

使用如下命令可以方便地查看到某个用户的权限:

SHOW GRANTS FOR 'webuser'@'192.168.100.%';

示例5:删除用户。

注意删除用户不要使用DELETE直接删除,因为使用DELETE删除后用户的权限并未删除,新建同名用户后又会继承以前的权限。正确的做法是使用DROP USER命令删除用户,例如,要删除'webuser'@'192.168.100.%'用户采用如下命令:

DROP USER 'webuser'@'192.168.100.%';

示例6:回收权限。

将前面创建的webuser用户的DELETE权限回收,使用如下命令:

REVOKE DELETE ON test.* FROM 'webuser'@'192.168.100.%';

 

 

十、【真题220】 MySQL数据库中的字段类型varchar和char的主要区别是什么?种字段的查找效率要高,为什么?

参考答案:varchar是变长,节省存储空间,char是固定长度。查找效率char型比varchar快,因为varchar是非定长,必须先查找长度,然后进行数据的提取,比char定长类型多了一个步骤,所以效率低一些。

 

 

购买链接:京东购买

以上就是PHP+mysql面试中经常爱考和爱问的几个笔试面试问题。

题目来自《PHP程序员面试笔试宝典》,里面涵盖了近三年了各大型企业常考的PHP面试题,针对面试题提取出来各种面试知识也涵盖在了本书。

更多PHP面试笔试真题可以浏览:www.shuaiqi100.com  

更多有趣有料的PHP面试笔试资料可以关注:“琉忆编程库”

或者浏览:www.shuaiqi100.com 获取。

PHP程序员面试笔试宝典下载:https://pan.baidu.com/s/1-ES2ZI3z5Lhv-zTKFmJDSQ

PHP和MySQL爱考的10道题的更多相关文章

  1. PHP爱考的那些笔试题

    PHP爱考的那些笔试题 来自<PHP程序员面试笔试宝典>,涵盖了近三年了各大型企业常考的PHP面试题,针对面试题提取出来各种面试知识也涵盖在了本书. 一.单例模式是在应用程序中最多只能拥有 ...

  2. oracle转Mysql中,varchar2(10)和number应该转换为什么类型?

    一. varchar2(10)和number应该转换为什么类型? oracle转成mysql时:varchar2(10)可以转成varchar(10)number则要看oracle中存储的具体是什么类 ...

  3. oracle转Mysql中,varchar2(10)和number应该转换为什么类型? (转)

    一. varchar2(10)和number应该转换为什么类型? oracle转成mysql时:varchar2(10)可以转成varchar(10)number则要看oracle中存储的具体是什么类 ...

  4. Mysql 保留最新的10条数据

    Mysql每天执行计划,保留最新的10条数据,其余的删除 1.Mysql 保留最新的10条数据 sql语句: DELETE tb FROM tbname AS tb,( SELECT id FROM ...

  5. [转帖] “王者对战”之 MySQL 8 vs PostgreSQL 10

    原贴地址:https://www.oschina.net/translate/showdown-mysql-8-vs-postgresql-10?lang=chs&page=2# 英文原版地址 ...

  6. UWP MySQL 最新版 6.10.5是坏的

    #实锤#证实了,MySQL 最新版 6.10.5,在UWP平台并不能连接,是坏的 Oracle竟然没有测试吗?直接上线??? 我已经把把BUG设置为最高严重等级,提交给了官方. I'm using u ...

  7. mysql数据库优化课程---10、mysql数据库分组聚合

    mysql数据库优化课程---10.mysql数据库分组聚合 一.总结 一句话总结:select concat(class,' 班') 班级,concat(count(*),' 人') 人数 from ...

  8. “王者对战”之 MySQL 8 vs PostgreSQL 10

    既然 MySQL 8 和 PostgreSQL 10 已经发布了,现在是时候回顾一下这两大开源关系型数据库是如何彼此竞争的. 在这些版本之前,人们普遍认为,Postgres 在功能集表现更出色,也因其 ...

  9. MySQL与MariaDB核心特性比较详细版v1.0(覆盖mysql 8.0/mariadb 10.3,包括优化、功能及维护)

    注:本文严禁任何形式的转载,原文使用word编写,为了大家阅读方便,提供pdf版下载. MySQL与MariaDB主要特性比较详细版v1.0(不含HA).pdf 链接:https://pan.baid ...

随机推荐

  1. jave 数据类型 float 的 正确赋值

    1.前言 float 是单精度浮点型 ,有效数字8位 ,在机内存占4个字节  [double 是双精度浮点型 ,有效数字16位 ,在机内存占8个字节 ] 2.赋值 float  a=1.3  会编译报 ...

  2. CentOS6.5安装CM5.13

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6610650059971232269/ 安装好虚拟机(2个节点) YUM源已安装好.系统版本CentOS6.5.ja ...

  3. 服务性能监控之Micrometer详解

    Micrometer 为基于 JVM 的应用程序的性能监测数据收集提供了一个通用的 API,支持多种度量指标类型,这些指标可以用于观察.警报以及对应用程序当前状态做出响应. 通过添加如下依赖可以将 M ...

  4. antd的table组件设置Column的width列宽度不生效问题

    超长连续字段(长数字和长单词) 破坏表格布局的问题(即使你指定了列的宽度也会被挤开),之前组件内默认加过 word-break: break-word; 去纠正此类布局,又会引起其他的问题. 所以最好 ...

  5. 使用NSSM把任意exe程序注册成Windows服务

    1.登录NSSM官网下载最新版本: http://www.nssm.cc/download 2.解压之后可以看到win32和win64位的nssm.exe,根据自己的电脑选择使用 3.拷贝一份nssm ...

  6. Java类与对象的创建

    以类的方式组织代码,以对象的方式组织(封装)数据 组织代码(类) public class Demo04 { String name;//默认值null int age;//默认值0 public v ...

  7. Spark-寒假-实验2

    1. 计算级数 代码: import scala.io.StdIn object jishu { def main(args:Array[String]) { var Sum=0.0 println( ...

  8. WebGPU 中消失的 VAO

    1 VAO 是 OpenGL 技术中提出来的 参考: 外链 其中有一段文字记录了 VAO 是什么: A Vertex Array Object (VAO) is an object which con ...

  9. go面试题-基础类

    go基础类 1. go优势 * 天生支持并发,性能高 * 单一的标准代码格式,比其它语言更具可读性 * 自动垃圾收集比java和python更有效,因为它与程序同时执行 go数据类型 int stri ...

  10. 多线程-线程间通信-多生产者多消费者问题(JDK1.5后Lock,Condition解决办法及开发中代码范例)

    1 package multithread4; 2 3 import java.util.concurrent.locks.Condition; 4 import java.util.concurre ...