搜索引擎优化高级编程:php版(UNION招聘考试:数据库优化的过程可以使用以下的方法 )

优采云 发布时间: 2021-09-28 19:07

  搜索引擎优化高级编程:php版(UNION招聘考试:数据库优化的过程可以使用以下的方法

)

  以下内容部分来自《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,如'province,gender',最好是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 其中 orderinfo.customerid 为 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表中的一条记录时,该订单也将被删除。

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

  【真题3】如何选择正确的存储引擎?

  MySQL 中有两种存储引擎:MyISAM 和 InnoDB。每个引擎都有优点和缺点。

  MyISAM 适用于一些需要大量查询的应用,但它对大量写操作的支持不是很好。甚至只需要更新一个字段,整个表就会被锁定,其他进程,甚至读进程都不能操作,直到读操作完成。此外,MyISAM 对于 SELECT COUNT(*) 等计算速度非常快。

  InnoDB 的趋势将是一个非常复杂的存储引擎,对于一些小型应用程序,它会比 MyISAM 慢。但是它支持“行锁”,所以写操作多的时候会更好。而且,它还支持更高级的应用程序,例如事务。

  【真题4】用什么方法检查PHP脚本的执行效率(一般是脚本执行时间)和数据库SQL效率(一般是数据库查询时间),定位分析脚本执行和数据库查询的瓶颈?

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

  检查数据库SQL效率的方法如下: 解释说明MySQL如何使用索引来处理select语句和连接表,以帮助选择更好的索引并编写更优化的查询语句。然后开启慢查询日志记录慢查询,通过查看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 表都支持 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语句,哪个选项可以限制返回的记录数?()(双选)

  选择 * 从 MY_TABLE

  A. 如果可能,将查询转换为存储例程

  B.如果程序允许,则指定返回记录的范围进行查询

  C. 如果可能,添加 where 条件

  D. 如果 DBMS 允许,则将查询转换为视图

  参考答案:B、C。

  分析:限制返回记录数的方法有两种——使用where条件或limit关键字来指定查询返回的记录范围。

  一般情况下,如果没有特殊需要,那么尽量不要使用select *,这样会浪费大量的数据缓存。

  以上内容摘自书籍《PHP程序员面试笔试合集》和《PHP程序员面试笔试真题解析》书籍。目前,这本书没有电子版。您可以在各大电商平台购买纸质版。

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线