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

优采云 发布时间: 2022-04-01 05:02

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

)

  以下内容部分来自《PHP程序员面试笔试合集》和《PHP程序员面试笔试分析》,如需转载,请注明出处。

  【真题1】执行下面的SQL语句时会出现( )。

  BEGIN TRANSACTION

DELETE FROM MYTABLE WHERE ID=1

DELETE FROM OTHERTABLE

ROLLBACK TRANSACTION

  A. OTHERTABLE 中的内容将被删除

  湾。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 语句确保对 customerinfo 表的其他访问不会插入、更新或删除操作,直到执行 UNLOCK TABLES 命令。

  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效率的方法如下: 可以用explain来展示MySQL是如何使用索引来处理select语句和join表的,帮助选择更好的索引,写出更优化的查询语句。然后开启慢查询日志,记录慢查询,通过查看SQL的执行时间和效率,定位分析脚本执行中的问题和瓶颈。

  我整理了一篇《什么是数据库三级阻塞协议?》的文章文章,关注公众号:“六一编程库”,回复:“锁”,我发给你。【真题5】下列说法正确的是( )。

  A. 使用索引可以加快插入数据

  湾。一个好的索引策略有助于防止跨站点攻击

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

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

  参考答案:C。

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

  索引无助于防止跨站攻击,所以选项 B 是错误的。

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

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

  【真题6】下列关于全文检索技术的说法不正确的是( )。

  A. Sphinx 是一个基于 SQL 的全文搜索引擎。它可以与 MySQL 结合进行全文搜索。它可以提供比数据库本身更专业的搜索功能。

  湾。Solr 是新一代的全文检索组件。它比 Lucene 高效得多。它还可以支持 HTTP 访问。PHP调用Solr也很方便。

  C。在 MySQL 中,为字段建立 FULLTEXT 索引,可以实现全文检索。目前,MyISAM 和 InnoDB 表都支持 FULLTEXT 索引。

  D、Lucene自带的二进制分词分析器CJKAnalyzer,分词速度快,可以满足一般的全文检索需求。

  参考答案:B。

  分析:Sphinx是一个基于SQL的全文搜索引擎,可以结合MySQL和PostgreSQL进行全文搜索。它可以提供比数据库本身更专业的搜索功能,使应用程序更容易实现专业的全文搜索。

  Solr是一个独立的企业级搜索应用服务器,用户可以通过HTTP请求访问。是一个基于 Lucene 的 JAVA5 开发的全文搜索服务器。同时,它被扩展为提供比 Lucene 更丰富的查询语言。它可配置、可扩展并针对查询性能进行了优化,并提供了完整的功能管理接口。它是一个非常好的全文搜索引擎。而且Solr的搜索效率比Lucene高很多,但是PHP调用Solr不方便,选项B的说法是错误的。

  MySQL 中的 MyISAM 和 InnoDB 都支持 FULLTEXT 全文索引。全文搜索引擎可以在不使用模板匹配操作的情况下查找单词或短语。

  【真题7】考虑下面的SQL语句,哪个选项可以限制返回记录数?( )(双选)

  从 MY_TABLE 中选择 *

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

  湾。如果程序允许,则指定返回给查询的记录范围

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

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

  参考答案:B、C。

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

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

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

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线