大家好,我是PHP程序员面试笔试系列的作者刘毅。本周(2019.3.4至3.8)135篇更新文章如下:周一:PHP面试MySQL数据库基础知识周??三:PHP面试MySQL数据库索引周五:PHP面试MySQL数据库真题今天周五,提前祝周末愉快每个人。整理了一篇《什么是数据库的三级锁定协议?》,关注公众号:《六一编程库》,回复:《锁定》,发给你。以下内容部分来自《PHP程序员面试笔试宝典》和《PHP程序员面试笔试真题解析》。如需转载,请注明出处。【真题1】()会在执行下面的SQL语句后出现。BEGINTRANSACTIONDELETEFROMMYTABLEWHEREID=1DELETEFROMOTHERTABLEROLLBACKTRANSACTIONA.OTHERTABLE中的内容将被删除B.OTHERTABLE和MYTABLE的内容将被删除C.OTHERTABLE中的内容将被删除,MYTABLE中ID为1的内容将被删除。D.数据库没有变化参考答案:D分析:这个查询是一个事务,这个事务结束有回滚,数据库不会变化。【真题2】如何优化数据库?数据库优化的过程可以通过以下方法进行:1)选择最适用的字段属性,尽可能减少定义字段的长度,尽可能将字段设置为NOTNULL,如'province,gender',最好设置为ENUM。2)使用连接(JOIN)而不是子查询。①删除没有任何订单的客户:DELETEFROMcustomerinfoWHEREcustomeridNOTin(SELECTcustomeridFROMorderinfo)。②提取所有没有订单的客户:SELECTFROMcustomerinfoWHEREcustomeridNOTin(SELECTcustomeridFROMorderinfo)。③提高b的速度:SELECTFROMcustomerinfoLEFTJOINorderidcustomerinfo.customerid=orderinfo.customeridWHEREorderinfo.customeridISNULL。3)使用联合(UNION)代替手动创建的临时表。创建临时表:SELECTnameFROM'nametest'UNIONSELECTusernameFROM'nametest2'。4)交易处理。保证数据完整性,例如添加和修改。同时,如果两个都为真,则都执行,都执行失败:mysql_query("BEGIN");mysql_query("INSERTINTOcustomerinfo(name)VALUES('$name1')";mysql_query("SELECT*FROM'orderinfo'wherecustomerid=".$id");mysql_query("COMMIT");5)锁表,优化事务处理,用SELECT语句取出初始数据,经过一些计算,用UPDATE语句将新值更新到表中。包含WRITE关键字的LOCKTABLE语句可以确保在执行UNLOCKTABLES命令之前不会有其他访问来插入、更新或删除customerinfo表。mysql_query("LOCKTABLEcustomerinfoREAD,orderinfoWRITE");mysql_query("SELECTcustomeridFROM'customerinfo'whereid=".$id);mysql_query("UPDATE'orderinfo'SETordertitle='$title'wherecustomerid=".$id);mysql_query("UNLOCKTABLES");6)使用外键优化锁表。将customerinfo中的customerid映射到orderinfo中的customerid,以及任何没有有效customerid的记录都不会写入orderinfo。CREATETABLEcustomerinfo(customeridINTNOTNULL,PRIMARYKEY(customerid))TYPE=INNODB;创建表orderinfo(orderidINTNOTNULL,customeridINTNOTNULL,PRIMARYKEY(customerid,orderid),FOREIGNKEY(customerid)REFERENCES()ONDELETECASCADE)TYPE=INNODB;注意:'ONDELETECASCADE',这个参数保证当customerinfo表中的一条记录被删除时,订单也会被删除。表中用户的所有记录,注意使用外键时数据库引擎必须定义为INNODB。【真题3】如何选择正确的存储引擎?MySQL中有两种存储引擎:MyISAM和InnoDB,每种引擎各有优缺点。MyISAM适用于一些需要大量查询的应用,但是对大量写操作的支持不是很好。即使只需要更新一个字段,整个表也会被锁定,其他进程,甚至是读进程,在读操作完成之前都不能运行。此外,MyISAM对于SELECTCOUNT(*)等计算速度极快。InnoDB的趋势将是一个非常复杂的存储引擎,对于一些小的应用程序,它会比MyISAM慢。但是它支持“行锁”,所以写操作越多越好。并且,它还支持更高级的应用程序,例如交易。【真题4】用什么方法检查PHP脚本的执行效率(通常是脚本执行时间)和数据库SQL效率(通常是数据库查询时间),定位分析脚本执行和数据库查询的瓶颈?参考答案:检查PHP脚本执行效率的方法如下:可以在要检查的代码开头记录一个时间,然后在代码末尾记录一个时间,取两者的差值结束时间和开始时间查看PHP脚本执行效率,可以使用microtime()函数记录时间。检查数据库SQL效率的方法如下:可以使用explain来说明MySQL是如何使用索引来处理select语句和join表的,有助于选择更好的索引,编写更优化的查询语句。然后启用慢查询日志记录慢查询,通过查看SQL执行时间和效率定位脚本执行中的问题和瓶颈。整理了一篇《什么是数据库的三级锁定协议?》,关注公众号:《六一编程库》,回复:《锁定》,发给你。【真题5】下列说法正确的是()。A。使用索引可以加快插入数据的速度B.良好的索引策略有助于防止跨站攻击C.应根据数据库的实际应用合理设计索引D.删除一条记录会导致索引整个表被销毁。参考答案:C。分析:索引的主要作用是帮助数据库快速找到对应的数据,并不能加快插入数据的速度。因此,选项A错误。索引不能帮助防止跨站攻击,所以选项B是错误的。创建可靠的索引需要分析数据库的实际使用情况并确定其弱点。优化脚本中的冗余查询也可以提高数据库效率。索引占用物理空间,因此在实际应用中,需要合理设计和使用索引。因此,选项C正确。索引是一个表结构,删除一条数据不会影响整个表的索引,而且索引不一定是数字,也可以是字符串。因此,选项D错误。【真题6】下列关于全文检索技术的说法错误的是()。A。Sphinx是一个基于SQL的全文搜索引擎,可以与MySQL结合进行全文搜索。它可以提供比数据库本身更专业的搜索功能。Solr是新一代的全文搜索组件,效率比Lucene高很多,支持HTTP访问。PHP调用Solr也很方便。在MySQL中为一个字段创建FULLTEXT索引,实现全文检索。目前,MyISAM和InnoDB表都支持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*FROMMY_TABLEA。如果可能,将查询转换为存储例程B.如果程序允许,则指定返回给查询的记录范围C.如果可能,添加一个where条件D.如果DBMS允许,则将查询转换为视图参考答案:B、C。分析:限制返回记录数的方法有两种——使用where条件或limit关键字指定查询返回记录的范围。通常,如果没有特殊需要,尽量不要使用select*,会浪费大量的数据缓存。以上内容节选自《PHP程序员面试笔试宝典》和《PHP程序员面试笔试真题解析》两本书。本书暂无电子版,纸质版可在各大电商平台购买。更多PHP相关面试知识和考题,请关注公众号获取:六一编程库,对本文有任何问题或建议可以留言。我会不断改进,追求极致,谢谢大家的支持。
