php面试题总结(希望建立在理解的基础上)(持续更新ing)

本文详细梳理了PHP面试中的常见知识点,包括MySQL的存储引擎对比、索引类型、数据恢复机制,以及Redis的基础知识。还探讨了数据库事务的ACID特性,重点讲解了回表、聚簇与非聚簇索引,以及redo和undo日志在InnoDB中的作用。此外,文章还涉及了数据结构中的哈希冲突解决方法,如链地址法,并讨论了数据结构与算法的基本概念,包括时间复杂度和空间复杂度。最后,提到了IO多路复用的概念和在处理并发请求中的优势。
摘要由CSDN通过智能技术生成

1,myisam 和 innodb
    什么是储存引擎?
        数据库的储存引擎决定了表在计算机中的储存方式,不同的储存引擎有不同的储存机制,索引技巧等
    储存引擎区别?
        初步区分的话是这样的,
        myisam表锁,不支持事物
        innodb行锁,支持事物,innodb支持外键
    补充说明:
        myisam建表之后会有三个文件(一个是frm表结构文件,一个是myd数据文件,一个是myi索引文件),myisam索引结构文件与数据文件是分开的,另外它的索引是非聚簇(也就是二级索引)所以说myisam的索引都需要回一次表.
        另外说明下,myisam索引文件存的是磁盘地址,过程是一次索引查询之后拿到磁盘地址(指针)。
        innodb建表之后会有两个文件(一个是表结构文件frm,一个是索引与数据文件ibd)

2,索引
    什么是索引
        索引是数据库中对一列或者多列值进行排序的一种数据结构,使用索引能快速的访问到想要的数据。
    索引都有哪些(mysql)
        mysql索引大概有5中
            主键索引
            唯一索引
            联合索引
            全文索引
            普通索引
    mysql索引数据结构演化过程
        二叉树-》红黑树-》btree-》b+tree

        btree 和 b+tree的区别:
            1,btree的关键字和记录是放在一起的,叶子接点可以看做外部节点,不包含任何信息;b+tree的非叶子节点中只有关键字和指向下一个节点的索引,记录只放在叶子节点中。
            2,btree中,越靠近跟节点的记录查找时间越快,只要找到关键字即可确定记录的存在;而b+tree中每个记录的查找时间基本是一样的,都需要从根节点走到叶子节点,而且在叶子节点中还要再比较关键字。

    联合索引遵循最左原则
    举例:
        一个表中有 id A B C D 5个字段。
        现在建立联合索引 A B C 
        能用到ABC的情况:
            select * from 表 A=? B=?C=?
            select * from 表 A=? B=?C>?
            select * from 表 A=? B=?C<?
            select * from 表 B=? A=?C<?-查询优化器
        能用到AB情况:
            select * from 表 A=? B>?C=?
            select * from 表 A=? B<?C>?
            select * from 表 A=? B like ?C<?
            select * from 表 A=? B between ?C<?
        能用到A情况 与上面AB类似
        
3,回表
    什么是回表?
        所谓回表,是指mysql查询数据,拿到相关数据的主键(地址(指针))然后再进行一次查询查到相关具体数据,简而言之若想拿到具体信息就需要俩次查询。
    聚簇索引&非聚簇索引
        mysql底层数据储存用的是b+tree数据结构;
        聚簇索引:叶子接点储存的是数据本身,所以聚簇索引不需要回表,一次就能查到整个真实数据。
        非聚簇索引:叶子接点储存不是数据本身,是一个地址(指针)or 主键等数据
    什么情况下需要回表?
        情形1,myisam数据储存引擎级结构决定了它的查询都需要进行一次回表操作
        情形2,覆盖索引不需要回表,
            什么是覆盖索引,覆盖索引就是例如:就是将A B联合索引起来,然后查询 (主键)id A B就是覆盖索引
        情形3,非覆盖索引,例如:建立联合索引 A B 然后查询的是 * 就都需要回表操作
    开发的时候需要注意什么?
        书写规范的sql语句。
        尽量建立覆盖索引,然后查询数据

4,mysql三范式
    第一范式,数据具有原子性,即每一列的数据都不能再拆分
    第二范式,建立在第一范式的基础上,所以非主键字段都要依赖主键,而不能依赖主键的一部分
    第三范式,建立在第二范式的基础上,非主键列只依赖主键,不依赖其他非主键
 

8,mysql日志
    错误日志
        这种日志记录的内容包括服务器的启动和关闭,以及与问题或异常条件有关的消息。如果服务器无法启动,就可以查看此类日志。它会在终止之前把消息写到出错日志,以指明出现了什么问题。
    普通查询日志
        这种日志记录的内容包括客户端连接、从客户端接收到的SQL语句和其他杂项事件。监视服务器的活动很有用处,从中可以了解到:'连接方是谁'、'它来之哪里',以及'它们在做什么'。当你想要查明客户端在往服务器发送什么样的语句时,使用日志是最方便的,它能为故障诊断或调试提供帮助。
    慢查询日志
        这种日志可以帮你把那些可能需要被重新、以求或得更好性能的语句识别出来。默认情况下,如果某个查询花费的时间超过了10秒。它便会被认为很慢,并且服务器会将它写到慢查询日志里。有几个系统弄变量可以进一步控制慢查询日志所记录的内容。
    二进制日志及二进制索引文件
        这种日志由一个或多个文件构成,记录由update、delete、insert、create table、drop table、grant等语句所做的修改。写到二进制日志里的内容都是一些以二进制格式编码的数据修改'事件'。二进制日志文件都伴随有一个索引文件,其中列出了当时存在的那些二进制日志文件。
        用途:
            1,在服务器崩溃之后,它可与备份一起配合完成表的恢复。首先,根据备份文件恢复数据库,然后,使用mysqlbinlog将二进制日志的内容转换为文本语句,并使用备份之后修改数据库的那些语句作为客户端mysql输入,把数据库恢复到崩溃时的状态。
            2,它形成了复制的基础,储存在二进制日志里的数据修改事件可被传输到复制从服务器。
    中继日志及中继日志索引文件
        如果服务器是一个复制从服务器,它就会维护一个中继日志,其中包含的是从主服务器接收到的需要被执行的数据修改事件记录。中继日志文件的格式与二进制日志文件的格式相同,它有一个索引文件,其中列出的是从服务器上存在的日志文件。
        
    redo日志 undo日志(innodb)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值