乐趣区

PHP面试MySQL数据库的面试题

你好,是我琉忆,PHP 程序员面试笔试系列图书的作者。
本周(2019.3.4 至 3.8)的一三五更新的文章如下:

周一:PHP 面试 MySQL 数据库的基础知识周三:PHP 面试 MySQL 数据库的索引周五:PHP 面试 MySQL 数据库的面试真题

今天周五,提前祝各位周末愉快。
自己整理了一篇“什么是数据库三级封锁协议?”的文章,关注公众号:“琉忆编程库”,回复:“锁”,我发给你。
以下内容部分来自《PHP 程序员面试笔试宝典》和《PHP 程序员面试笔试真题解析》如需转载请注明出处。

【真题 1】执行以下 SQL 语句后将发生()。
BEGIN TRANSACTION
DELETE FROM MYTABLE WHERE ID=1
DELETE FROM OTHERTABLE
ROLLBACK TRANSACTION

A.OTHERTABLE 中的内容将被删除
B.OTHERTABLE 和 MYTABLE 中的内容都会被删除
C.OTHERTABLE 中的内容将被删除,MYTABLE 中 ID 是 1 的内容将被删除
D.数据库没有变化
参考答案:D。
分析:这个查询是一个事务,并且这个事务的最后有回滚,数据库不会有变化。

【真题 2】如何进行数据库优化?
数据库优化的过程可以使用以下的方法进行:
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。

【真题 3】如何选择正确的存储引擎?
在 MySQL 中有两个存储引擎:MyISAM 和 InnoDB,每个引擎都有利有弊。
MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作的支持并不是很好。甚至只是需要 update 一个字段,整个表都会被锁起来,而其他进程,就算是读进程都无法操作直到读操作完成。另外,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的。
InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。但是它支持“行锁”,于是在写操作比较多的时候,会更优秀。并且,它还支持更多的高级应用,例如事务。

【真题 4】用什么方法检查 PHP 脚本的执行效率(通常是脚本执行时间)和数据库 SQL 的效率(通常是数据库 query 时间),并定位和分析脚本执行和数据库查询的瓶颈所在?
参考答案:检查 PHP 脚本的执行效率的方法如下:可以在检查的代码开头记录一个时间,然后在代码的结尾也记录一个时间,结尾时间减去开头时间取这个时间的差值,从而检查 PHP 的脚本执行效率,记录时间可以使用 microtime() 函数。
检查数据库 SQL 的效率的方法如下:可以通过 explain 显示 MySQL 如何使用索引来处理 select 语句及连接表,帮助选择更好的索引和写出更优化的查询语句。然后启用 slow query log 记录慢查询,通过查看 SQL 的执行时间和效率来定位分析脚本执行的问题和瓶颈所在。

自己整理了一篇“什么是数据库三级封锁协议?”的文章,关注公众号:“琉忆编程库”,回复:“锁”,我发给你。

【真题 5】以下说法正确的是()。
A.使用索引能加快插入数据的速度
B.良好的索引策略有助于防止跨站攻击
C.应当根据数据库的实际应用合理设计索引
D.删除一条记录将导致整个表的索引被破坏
参考答案:C。
分析:索引的作用主要是帮助数据库快速查找到对应的数据,并不能加快插入数据的速度,所以,选项 A 错误。
索引不能够帮助防止跨站攻击,所以,选项 B 错误。
创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。索引是占用物理空间的,所以在实际的应用中是要合理设计使用索引的。所以,选项 C 正确。
索引是一种表结构,删除一条数据也不会影响到整个表的索引,并且索引不一定是数字,也可以是字符串。所以,选项 D 错误。

【真题 6】下列关于全文检索技术的说法中,不正确的是()。
A.Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能
B.Solr 是新一代的全文检索组件,它比 Lucene 的搜索效率高很多,还能支持 HTTP 的访问方式,PHP 调用 Solr 也很方便
C.MySQL 中把一个字段建立 FULLTEXT 索引,就可以实现全文检索,目前 MyISAM 和 InnoDB 的 table 都支持 FULLTEXT 索引
D.Lucene 附带的二元分词分析器 CJKAnalyzer 切词速度很快,能满足一般的全文检索需要
参考答案:B。
分析:Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。
Solr 是一个独立的企业级搜索应用服务器,用户可以通过 HTTP 请求访问,它是采用 JAVA5 开发,基于 Lucene 的全文搜索服务器,同时对其进行了扩展,提供了比 Lucene 更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。并且 Solr 比 Lucene 的搜索效率高很多,但是 PHP 调用 Solr 并不方便,选项 B 的说法错误。
MySQL 中的 MyISAM 和 InnoDB 都是支持 FULLTEXT 全文索引的。全文搜索引擎可以在不使用模板匹配操作的情况下查找单词或短语。

【真题 7】考虑如下 SQL 语句,哪个选项能对返回记录的条数进行限制?()(双选)
SELECT * FROM MY_TABLE
A.如果可能,那么把查询转换成存储例程
B.如果程序允许,那么给查询指定返回记录的范围
C.如果可能,那么添加 where 条件
D.如果 DBMS 允许,那么把查询转换成视图
参考答案:B、C。
分析:有两个方法能限制返回记录的条数——使用 where 条件或 limit 关键字指定查询返回的记录的范围。
通常情况下,如果没有特殊需要,那么尽量不要用 select *,这会浪费大量的数据缓存。

以上内容摘自《PHP 程序员面试笔试宝典》和《PHP 程序员面试笔试真题解析》书籍,目前本书没有电子版,可到各大电商平台购买纸质版。更多 PHP 相关的面试知识、考题可以关注公众号获取:琉忆编程库对本文有什么问题或建议都可以进行留言,我将不断完善追求极致,感谢你们的支持。

退出移动版