php程序的执行过程 简答题,PHP面试题 - 数据库

1、 什么是存储过程?它与函数有什么区别与联系?

SQL语句执行的时候要先编译,然后再被执行。在大型数据库系统中,为了提高效率,将为了完成特定功能的SQL语句集进行编译优化后,存储在数据库服务器中,用户通过指定存储过程的名字来调用执行。

例如,如下为一个创建存储过程的常用语法:

create procedure sp_name @[参数名][类型]

as

begin

........

End

调用存储过程语法:exec sp_name [参数名]

删除存储过程语法:drop procedure sp_name

使用存储过程可以增强SQL语言的功能和灵活性,由于可以用流程控制语句编写存储过程,有很强的灵活性,所以可以完成复杂的判断和运算,并且可以保证数据的安全性和完整性,同时存储过程可以使没有权限的用户在控制之下间接地存取数据库,也保证了数据的安全。

需要注意的是,存储过程不等于函数,二者虽然本质上没有区别,但具体而言,还是有如下几个方面的区别:

1)存储过程一般是作为一个独立的部分来执行,而函数可以作为查询语句的一个部分来调用。由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。

2)一般而言,存储过程实现的功能较复杂,而函数实现的功能针对性比较强。

3)函数需要用括号包住输入的参数,且只能返回一个值或表对象,存储过程可以返回多个参数。

4)函数可以嵌入在SQL中使用,可以在SELECT中调用,存储过程不行。

5)函数不能直接操作实体表,只能操作内建表。

6)存储过程在创建时即在服务器上进行了编译,执行速度更快。

2、如果数据库日志满了,那么会出现什么情况?

日志文件(Log File)记录所有对数据库数据的修改,主要是保护数据库以防止故障,以及恢复数据时使用。其特点如下:

1)每一个数据库至少包含两个日志文件组。每个日志文件组至少包含两个日志文件成员。

2)日志文件组以循环方式进行写操作。

3)每一个日志文件成员对应一个物理文件。

通过日志文件来记录数据库事务可以最大限度地保证数据的一致性与安全性,但一旦数据库中日志满了,就只能执行查询等读操作,不能执行更改、备份等操作,原因是任何写操作都要记录日志,也就是说,基本上处于不能使用的状态。

3、 索引的优缺点

创建索引可以大大提高系统的性能,总体来说,索引的优点如下:

1)大大加快数据的检索速度,这也是创建索引的最主要的原因。

2)索引可以加速表和表之间的连接。

3)索引在实现数据的参照完整性方面特别有意义,例如,在外键列上创建索引可以有效地避免死锁的发生,也可以防止当更新父表主键时,数据库对子表的全表锁定。

4)索引是减少磁盘I/O的许多有效手段之一。

5)当使用分组(GROUP BY)和排序(ORDER BY)子句进行数据检索时,可以显著减少查询中分组和排序的时间,大大加快数据的检索速度。

6)创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

7)通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

索引的缺点如下:

1)索引必须创建在表上,不能创建在视图上。

2)创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。

3)建立索引需要占用物理空间,如果要建立聚簇索引,那么需要的空间会很大。

4)当对表中的数据进行增加、删除和修改的时候,系统必须要有额外的时间来同时对索引进行更新维护,以维持数据和索引的一致性,所以,索引降低了数据的维护速度。

索引的使用原则如下:

1)在大表上建立索引才有意义。

2)在WHERE子句或者连接条件经常引用的列上建立索引。

3)索引的层次不要超过4层。

4)如果某属性常作为最大值和最小值等聚集函数的参数,那么考虑为该属性建立索引。

5)表的主键、外键必须有索引。

6)创建了主键和唯一约束后会自动创建唯一索引。

7)经常与其他表进行连接的表,在连接字段上应该建立索引。

8)经常出现在WHERE子句中的字段,特别是大表的字段,应该建立索引。

9)要索引的列经常被查询,并只返回表中的行的总数的一小部分。

10)对于那些查询中很少涉及的列、重复值比较多的列尽量不要建立索引。

11)经常出现在关键字ORDER BY、GROUP BY、DISTINCT后面的字段,最好建立索引。

12)索引应该建在选择性高的字段上。

13)索引应该建在小字段上,对于大的文本字段甚至超长字段,不适合建索引。对于定义为CLOB.TEXT、IMAGE和BIT的数据类型的列不适合建立索引。

14)复合索引的建立需要进行仔细分析。正确选择复合索引中的前导列字段,一般是选择性较好的字段。

15)如果单字段查询很少甚至没有,那么可以建立复合索引;否则考虑单字段索引。

16)如果复合索引中包含的字段经常单独出现在WHERE子句中,那么分解为多个单字段索引。

17)如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段。

18)如果既有单字段索引,又有这几个字段上的复合索引,那么一般可以删除复合索引。

19)频繁进行DML操作的表,不要建立太多的索引。

20)删除无用的索引,避免对执行计划造成负面影响。

“水可载舟,亦可覆舟”,索引也一样。索引有助于提高检索性能,但过多或不当的索引也会导致系统低效。不要认为索引可以解决一切性能问题,否则就大错特错了。因为用户在表中每加进一个索引,数据库就要做更多的工作。过多的索引甚至会导致索引碎片。所以说,要建立一个“适当”的索引体系,特别是对聚合索引的创建,更应精益求精,这样才能使数据库得到高性能的发挥。所以,提高查询效率是以消耗一定的系统资源为代价的,索引不能盲目地建立,这是考验一个DBA是否优秀的一个很重要的指标。

【真题209】 增加一个用户test2密码为abc,使其只可以在localhost上登录,并可以对数据库mydb进行查询、插入、修改、删除的操作。

参考答案:(localhost是指本地主机,即MySQL数据库所在的那台主机),这样用户即使知道test2的密码,他也无法从Internet上直接访问数据库,只能通过MySQL主机上的Web页来访问。

grant select,insert,update,delete on mydb.* to test2@localhost identified by "abc";

【真题210】 修改MySQL用户root的密码的指令是( )。

A.mysql admin -u root password test B.mysql -u root password test

C.mysql -u root -p test D.mysql -u root -password test

参考答案:A。

分析:修改MySQL用户root密码的指令格式为mysql admin -u 用户名 password 密码。

所以,本题的答案为A。

4、什么是数据库引擎?

在MySQL中存在MyISAM、InnoDB、BDB(Berkeley DB)、MergE、Memory(Heap)、ExamplE、FederateD、ArchivE、CSV、BlackholE、MaxDB等十几种引擎,其中用得最多的引擎是MyISAM、InnoDB。下面简单地对常用的四个引擎做个介绍。

1)MyISAM:默认的MySQL插件式存储引擎。如果应用是以读写操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么可选用此种存储引擎。

2)InnoDB:用于事务处理应用程序,支持外键。如果应用对事务的完整性有比较高的要求,在并发条件下要求数据一致性,数据操作除了插入和查询以外,还包括很多的更新删除操作,那么InnoDB比较合适。InnoDB存储引擎除了有效地降低由于删除和更新操作导致的锁定,还可以确保事务的完整提交和回滚。

3)MEMORY:将所有的数据保存在RAM中,在需要快速定位记录和其他类似数据的环境下,可提供极快的访问。MEMORY的缺陷是对表的大小有限制,太大的表无法缓存在内存中,其次要确保表数据可以恢复,数据库异常终止后表中的数据是可以恢复的。MEMORY表通常用于更新不太频繁的小表,用以快速得到访问结果。

4)MERGE:用于将一系列等同的MyISAM表以逻辑方式组合在一起,并作为一个对象引用它们。MERGE表的优点在于可以突破对单个MyISAM表大小的限制,并且将不同的表分布在多个磁盘上,可以有效地改善MERGE表的访问效率。

【真题224】 在MySQL中,简述InnoDB和MyISAM的优劣。

参考答案:MySQL中默认的引擎是MyISAM,如果数据库的基本操作主要是CRUD操作,那么使用MyISAM是最好的。MyISAM基于传统的ISAM类型,是Indexed Sequential Access Method(有索引的顺序访问方法)的缩写,它是存储记录和文件的标准方法。MyISAM的优点是拥有检查和修复表格的大多数工具,它的表格可以被压缩并支持全文搜索,如果只是执行大量的SELECT,那么MyISAM是最好的选择,效率比InnoDB高。它的缺点是不支持外键和事务回滚,不具有原子性。

InnoDB的引擎类型是事务安全的。它和BDB类型引擎具有相同的特性,并且支持外键和事务回滚。它的优点是具有比BDB还丰富的特性,对于要求事务安全的存储使用它是最好的。当执行大量的INSERT或UPDATE时,在性能上应该使用InnoDB表。它的缺点是因为AUTOCOMMIT默认设置是打开的,程序没有显式调用BEGIN开始事务,导致每插入一条数据都自动commit,严重影响了速度,所以可以在执行SQL前调用begin,多条SQL形成一个事务。

【真题55】 以下说法不正确的是( )。

A.PHP有四种标量类型:布尔型(boolean)、整型(integer)、浮点型(float)、字符串(string)

B.浮点型(float)与双精度型(double)是同一种类型

C.复合类型包括:数组(array)、对象(object)、资源(resource)

D.伪类型:混合型(mixed)、数字型(number)、回调(callback)

参考答案:C。

分析:PHP主要有八种数据类型,根据类型还可以被划分为三大类,标量类型中包含布尔型、整型和浮点型,复合类型包括数组和对象,特殊类型包括资源类型和空类型。除此之外,PHP还可以存在伪类型,主要是数据存在混合相关联,所以存在伪类型。

所以,本题答案为C。

【真题231】 用什么方法检查PHP脚本的执行效率(通常是脚本执行时间)和数据库SQL的效率(通常是数据库query时间),并定位和分析脚本执行和数据库查询的瓶颈所在?

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

检查数据库SQL的效率的方法如下:可以通过explain显示MySQL如何使用索引来处理select语句及连接表,帮助选择更好的索引和写出更优化的查询语句。然后启用slow query log记录慢查询,通过查看SQL的执行时间和效率来定位分析脚本执行的问题和瓶颈所在。

【真题232】 考虑如下数据表和查询,如何添加索引能提高查询速度?( )

CREATE TABLE MYTABLE (

ID INT,

NAME VARCHAR (100),

ADDRESS1 VARCHAR (100),

ADDRESS2 VARCHAR (100),

ZIPCODE VARCHAR (10),

CITY VARCHAR (50),

PROVINCE VARCHAR (2)

)

SELECT ID, VARCHAR FROM MYTABLE WHERE ID BETWEEN 0 AND 100 ORDER BY NAME, ZIPCODE

A.给 ID 添加索引

B.给 NAME 和 ADDRESS1 添加索引

C.给ID 添加索引,然后给 NAME 和 ZIPCODE 分别添加索引

D.给ZIPCODE 和 NAME 添加索引

参考答案:C。

分析:给ID字段设置索引能提高 where 条件执行的效率,给 NAME 和 ZIPCODE设索引则能使排序更快。

以上题目摘自《PHP程序员面试笔试宝典》

更多PHP面试真题可以关注公众号“琉忆编程库”获取。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值