你好,是我琉忆,PHP程序员面试笔试系列图书的做者。mysql
本周(2019.3.4至3.8)的一三五更新的文章以下:程序员
周一:PHP面试MySQL数据库的基础知识
周三:PHP面试MySQL数据库的索引
周五:PHP面试MySQL数据库的面试真题
今天周五,提早祝各位周末愉快。面试
本身整理了一篇“ 什么是数据库三级封锁协议?”的文章,关注公众号:“ 琉忆编程库”,回复:“ 锁”,我发给你。
如下内容部分来自《PHP程序员面试笔试宝典》和《PHP程序员面试笔试真题解析》如需转载请注明出处。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。函数
分析:这个查询是一个事务,而且这个事务的最后有回滚,数据库不会有变化。性能
数据库优化的过程可使用如下的方法进行:
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 还慢。可是它支持“行锁”,因而在写操做比较多的时候,会更优秀。而且,它还支持更多的高级应用,例如事务。
参考答案:检查PHP脚本的执行效率的方法以下:能够在检查的代码开头记录一个时间,而后在代码的结尾也记录一个时间,结尾时间减去开头时间取这个时间的差值,从而检查PHP的脚本执行效率,记录时间可使用microtime()函数。
检查数据库SQL的效率的方法以下:能够经过explain显示MySQL如何使用索引来处理select语句及链接表,帮助选择更好的索引和写出更优化的查询语句。而后启用slow query log记录慢查询,经过查看SQL的执行时间和效率来定位分析脚本执行的问题和瓶颈所在。
本身整理了一篇“ 什么是数据库三级封锁协议?”的文章,关注公众号:“ 琉忆编程库”,回复:“ 锁”,我发给你。
A.使用索引能加快插入数据的速度
B.良好的索引策略有助于防止跨站攻击
C.应当根据数据库的实际应用合理设计索引
D.删除一条记录将致使整个表的索引被破坏
参考答案:C。
分析:索引的做用主要是帮助数据库快速查找到对应的数据,并不能加快插入数据的速度,因此,选项A错误。
索引不可以帮助防止跨站攻击,因此,选项B错误。
建立合理的索引须要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询一样也能提升数据库效率。索引是占用物理空间的,因此在实际的应用中是要合理设计使用索引的。因此,选项C正确。
索引是一种表结构,删除一条数据也不会影响到整个表的索引,而且索引不必定是数字,也能够是字符串。因此,选项D错误。
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全文索引的。全文搜索引擎能够在不使用模板匹配操做的状况下查找单词或短语。
SELECT * FROM MY_TABLE
A.若是可能,那么把查询转换成存储例程
B.若是程序容许,那么给查询指定返回记录的范围
C.若是可能,那么添加 where 条件
D.若是DBMS容许,那么把查询转换成视图
参考答案:B、C。
分析:有两个方法能限制返回记录的条数——使用 where 条件或limit关键字指定查询返回的记录的范围。
一般状况下,若是没有特殊须要,那么尽可能不要用 select *,这会浪费大量的数据缓存。
以上内容摘自《PHP程序员面试笔试宝典》和《PHP程序员面试笔试真题解析》书籍,目前本书没有电子版,可到各大电商平台购买纸质版。
更多PHP相关的面试知识、考题能够关注公众号获取:琉忆编程库
对本文有什么问题或建议均可以进行留言,我将不断完善追求极致,感谢大家的支持。