1。事物并发?事务隔离级别,每个级别会导致什么问题?MySQL默认是第几级?事物之间应该完全隔离,避免事物并发带来的问题,但是,这会对性能产生巨大的影响,因为事物必须顺序运行,在实际开发中,为了提高性能,事物会处于较低的隔离状态级别操作,事务隔离级别可以通过isolation事务属性指定。事物的并发问题1)脏读:事务A读取事务B更新的数据,然后B回滚操作,那么A读取的数据就是脏数据。2)不可重复读:事务A多次读取同一个数据,事务B在事务A多次读取的过程中更新并提交数据,导致事务A多次读取同一个数据。事务两次读取数据的结果会不一致。3)幻读:幻读解决不可重复读,保证在同一个事务中,查询的结果是事务开始时的状态(一致性)。事务隔离级别1)Readuncommitted:另一个事务修改了数据,但是还没有提交,这个事务中的SELECT会读到这些未提交数据的脏读。2)不可重复读:事务A多次读取同一个数据,事务B在事务A多次读取的过程中更新并提交数据,导致事务A多次读取同一个数据。事务两次读取数据的结果会不一致。3)可重复读:在同一个事务中,SELECT的结果是事务开始时间点的状态,所以同一个SELECT操作读取的结果会是一致的。但是会出现幻读现象。4)Serialization:最高的隔离级别,在此隔离级别下,不会产生异常。并发事务,就像事务是一个一个顺序执行的。MySQL默认的事务隔离级别是repeatable-read。2、MySQL存储引擎MylSAM和InnoDB有什么区别?1)InnoDB支持事务,而MylSAM不支持,这一点很重要。事务是一种高级处理方式。比如有些列的增删改错,只要有错误,就可以回滚恢复,而MylSAM不能。2)MylSAM适用于基于查询和插入的应用程序。InnoDB适用于修改频繁、安全性高的应用。3)InnoDB支持外键,而MylSAM不支持。4)从MySQL5.5.5开始,InnoDB是默认引擎。5)InnoDB不支持全文类型的索引。6)InnoDB不保存表的行数,比如selectcount()fromtable,InnoDB需要扫描整个表计算有多少行,而MylSAM只需要简单读取保存的行数即可。请注意,当count()语句包含where条件时,MylSAM还需要扫描整个表。7)对于自增字段,InnoDB必须只包含该字段的索引,但可以与MylSAM表中的其他字段建立联合索引。8)DELETEFROMTABLE时,InnoDB不会重新创建表,而是逐行删除,速度很慢。MylSAM将重建表。9)InnoDB支持行锁(在某些情况下,它仍然锁定整个表,如updatetableseta=1whereuserlike%lee%'。3.什么是临时表?什么时候删除临时表?1)临时表可以手动删除:DROPTEMPORARYTABLEIFEXISTStemp_tb;2)临时表只在当前连接可见。当连接关闭时,MySQL会自动删除表并释放所有空间。因此可以在不同的连接中创建同名的临时表,对属于该连接的临时表进行操作。3)创建临时表的语法与创建表类似,不同的是增加了关键字TEMPORARY,如:CREATETEMPORARYTABLEtmp_table(NAMEVARCHAR(10)NOTNULL,timedateNOTNULLselect*fromtmp_table;4.关于MySQL数据库两种存储引擎,MylSAM和InnoDB如何选择?1)INNODB支持关系型数据库的一些高级功能,比如事务功能,行级锁,MylSAM不支持。2)MylSAM性能更好,占用存储空间更少。因此,选择哪种存储引擎取决于具体的应用。3)如果你的应用一定要用到事务,毫无疑问你要选择INNODB引擎。但要注意INNODB的行级锁是有条件的。当where条件不使用主键时,整个表仍然会被锁住。例如,DELETEFROMmytable等删除语句。4)如果你的应用对查询性能要求高,使用MylSAM。MylSAM索引和数据分离,其索引是压缩的,可以更好的利用内存。所以它的查询性能明显优于INNODB。压缩索引还可以节省一些磁盘空间。MylSAM具有全文索引的功能,可以大大优化LIKE查询的效率。5、MySQLB+Tree索引和Hash索引有什么区别?1)Hash索引结构的特殊性,其检索效率非常高,索引检索可以一次性定位;2)B+树索引需要多次IO访问,从根节点到分支节点,最后到页节点;注:BAT面试经常问,为什么用B+树索引而不用Hash索引?哈希索引1)哈希索引只能满足“=”、“IN”、“”查询,不能使用范围查询,因为不能保证经过相应的哈希算法处理后的哈希值的大小关系完全相同如Hash运算前——2)不能使用Hash索引来避免数据排序操作,因为Hash值的大小关系不一定与Hash运算前的key值完全相同;3)无法使用部分索引键查询Hash索引。对于复合索引,Hash索引在计算Hash值时,将合并后的索引键合并,然后一起计算Hash值,而不是单独计算Hash值。因此,通过前一个索引键或组合索引的键查询时,不能使用Hash索引。;4)Hash索引在任何时候都无法避免表扫描。由于不同的索引键具有相同的Hash值,即使得到满足某个Hash键值的记录条数,也不能直接从Hash索引完成查询,或者需要将数据查询回表;5)当大量Hash值相等时,Hash索引的性能不一定会比B+树索引高。StoreHash冲突B+Tree索引:1)在MySQL中,只有HEAP/MEMORY引擎支持Hash索引。2)常用的InnoDB引擎默认使用B+树索引。它会实时监控表上索引的使用情况。如果认为建立哈希索引可以提高查询效率,它会自动在内存中缓存“自适应哈希索引”。Area”来构建哈希索引(InnoDB默认启用自适应哈希索引),通过观察搜索方式,MySQL会使用索引键的前缀来构建哈希索引,如果几乎大部分表都在bufferpool,然后创建一个hash索引可以加快等价查询B+树索引和hash索引的明显区别是:1)如果是等价查询,那么hash索引显然有绝对的优势,因为只有一个需要算法找到对应的键值,这个前提是键值是唯一的。如果key值不唯一,需要先找到目标所在的位置,然后根据S表向后扫描,直到找到对应的key;如果是范围查询检索,那么hash索引就没用了,因为原本有序的键值经过hash算法后可能变得不连续,没办法使用索引完成范围查询检索;2)hash索引不能利用索引完成排序,像,xxx%这样的部分模糊查询(这种部分模糊查询本质上是范围查询);3)哈希索引不支持多列联合索引的最左匹配规则;4)B+树索引的关键词检索效率比较平均,不像B树那样波动很大。在有大量重复键值的情况下,哈希索引的效率也极低,因为存在所谓的哈希碰撞问题。5)大部分场景下,都会有范围查询、排序、分组等查询特性,B+树索引就足够了。6、聚簇索引和非聚簇索引有什么区别?聚集索引和非聚集索引的根本区别在于表记录的排序顺序是否与索引的排序顺序一致。聚簇索引1)聚簇索引表记录的排序顺序与索引的排序顺序一致(所以查询效率快,只要找到第一个索引值记录,其余的连续记录也存储连续在物理上。聚簇索引的缺点是修改慢,因为为了保证表中记录的物理顺序和索引顺序一致,插入记录时会重新排序数据页。2)聚簇索引类似于用拼音查找汉字的新华字典,拼音检索表在秘书中的顺序是按照a~z排列的,就像逻辑顺序和物理顺序一样,非聚簇索引1)非聚集索引制定了表中记录的逻辑顺序,但物理记录和索引记录不一定一致。索引采用B+树结构,非聚集索引的叶子层与实际的数据页不重叠,但叶子层在数据页中包含指向表中记录的指针。非聚集索引层次多,不会造成数据重排。非聚集索引类似于新华字典的部首查询汉字。检索表可能是横排、竖排、撇号排列,但是由于文字是按照拼音从a到z的顺序排列的,类似于逻辑地址与物理地址不对应。2)适用情况是分组,大量不同的值,频繁更新的列。这些情况不适合聚簇索引。7、如何解决MySQL慢查询?1)slowquerylog慢查询启用状态。2)slowquerylog_file存储慢查询日志的位置(该目录需要mysql运行账号的可写权限,一般设置为mysql数据存放目录)。3)longquerytime查询超过多长时间才记录。8、MySQL高并发环境的解决方案有哪些?1)分库分表:横向分库分表,从单点分布到多点数据库,从而减轻单点数据库的压力。2)集群方案:解决DB宕机导致单点DB无法访问的问题。3)读写分离策略:极大的提高了应用中Read数据的速度和并发度。无法解决高写入压力。阿里专访9、从innodb的索引结构分析,为什么索引的key长度不能太长?如果key太长,一个page中可以存储的key数量会减少,这会间接导致索引树的page数量增加,索引层级升高,从而影响效率整体查询变化。10、如何将MySQL数据恢复到任意时间点?恢复到任意时间点是基于定期全量备份和增量binlog日志备份。恢复到任意时间点,先恢复全量备份,然后回放添加的binlog,直到指定时间点。腾讯面试11.如何解决MYSQL的主从延迟。1)半同步复制从MySQL5.5开始,MySQL已经支持半同步复制。半同步复制介于异步复制和同步复制之间。一个从库中接收并写入中继日志,然后再将结果返回给客户端。与异步复制相比,半同步复制提高了数据的安全性,但也造成了TCP/IP往返的耗时延迟。2)主库配置syncbinlog=1,innodbflushlogattrxcommit=1syncbinlog默认值为0,MySQL不会将binlog同步到磁盘,它的值表示每写入多少binlog,就同步一次磁盘,innodbflushlogatzxcommit为1,表示每次事务提交或事务向南所有命令都需要将日志刷新到磁盘。3)优化网络。升级从站硬件配置。升级到5.7使用并行复制12.某表近千万条数据,CRUD比较长。如何优化呢?1)可以做分表,减少单表字段数,优化表结构。2)在保证主键有效的情况下,检查主键索引的字段顺序,使查询语句中条件的字段顺序与主键索引的字段顺序一致。3)单表条件下,SQL语句,行索引优化等,提高数据检索速度。13、高并发下,如何安全修改同一行数据?1)悲观锁2)FIFO(FirstInputFirstOutput)缓存队列思想3)使用乐观锁百度面试14、关系型数据库使用的数据结构是什么类型的数据结构?1)数据库的数据结构包括:非线性数据结构、树形数据结构、集合数据结构2)数据结构以二维表形式存储(非线性数据结构)。3)二维表与关系——二维表;tuple-二维表中的行分量-二维表中的列4)B+Tree索引-树型数据结构Hash索引-集合数据结构注:四种基本数据结构。线性数据结构(元素之间是一对一的关系)结构又细分为数组、链表、队列和栈。)、树数据结构(如二叉树、平衡二叉树、B+树)、集合数据结构、图数据结构15、数据库索引的实现?1)数据的索引实现为B+Tree和hash索引结构来存储数据。2)B+Tree是多路平衡查询树,所以它的节点自然是有序的(左子节点小于父节点,父节点小于右子节点),所以没必要为范围查询扫描做一个完整的表。3)哈希索引的底层是哈希表。哈希表是一种以key-value的方式存储数据的结构,所以多个数据的存储关系根本就没有顺序关系。大家注意点,别迷路了,以上就是本文的全部内容,能看到这里的都是人才。前面说了PHP的技术点很多,也是因为太多了,写的太多了,写完了也不会看太多,所以我这里整理成了PDF和文档,有需要的可以点击进入秘籍:PHP+「平台」更多学习内容可以访问【比大厂】优质PHP架构师教程目录,只要会看,薪资高会更上一层楼(持续更新)。以上内容希望对大家有所帮助,很多PHPer在进阶的时候总会遇到一些问题和瓶颈。业务代码写多了就没有方向感。架构、高扩展、高性能、高并发、服务器性能调优、TP6、laravel、YII2、Redis、Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等进阶知识点级别的干货,可以免费分享给大家,需要的话可以加入我的PHP技术交流群
