zoukankan      html  css  js  c++  java
  • PHP工程师必备知识整理

    一、http/https协议,tcp/ip协议,websocketsessioncookie

    二、phpoop,thinkphp5,laravel

    三、mysqlmemcacheredis

    3.1  mysql面试题目

    3.1.1 MySQL的复制原理以及流程

    3.1.2 charvarchar的区别?

       * char用于存放固定长度的字符串,长度最大为255,比指定长度大的值将被截断,而比指定长度小的值将会用空格进行填补。

       * varchar用于保存可变长度的字符串,长度最大为65535,只存储字符串实际需要的长度,它会增加一个额外字节来保存字符串本身的长度,varchar使用额外的1~2字节来存储值的长度。如果列的最大长度小于或等于255,则使用1字节,否则使用2字节。

       * charvarchar跟字符编码也有密切联系,lantin1占用1个字节,gbk占用2个字节,utf8占用3个字节。

    3.1.3 mysql慢查询日志

    * Mysql的慢查询日志,顾名思义就是把执行时间超过设定值(默认10s)的SQL记录到日志中。这项功能需要手动开启,但是开启后会造成一定的性能损耗。

    * 查看是否开启:show variables like ‘%slow_query_log%’;

    * 开启慢查询:set global slow_query_log=1;

    * my.cnf设置:

      slow_query_log=1

      long_query_time=10

      slow_query_file=/path/mysql_slow.log

    * log_outpout:

     指定日志的存储方式。log_output=’FILE’标识日志存入文件,默认值是FILE’。log_output=’TABLE’表示将日志存入数据库,这样日志信息就会被写入到mysql.slow_log表中。

    数据库支持同时两种日志存储方式,配置的时候以逗号隔开即可,如:log_output=’FILETABLE’。

     日志记录到系统的专用日志表中,要比记录到文件耗费更多的系统资源,因此对于需要启用慢查询日志,又需要能获得更高的系统性能,建议优先记录到文件。

    * log-query-not-using-indexes:

     未使用索引的查询也被记录到慢查询日志中(可选项)。如果调优的话,建议开启这个选项。另外,开启了这个参数,其实使用full index scansql也会被记录到慢查询日志。

    * log_slow_admin_statements:

     表示是否将慢管理语句例如ANALYZE TABLEALTER TABLE等记录慢查询日志。

    * 分析工具mysqldumpslow  -- 慢查询分析工具

      

    3.1.4 索引的类型

    * 主键索引,主键自动的为主索引(类型Primary

    * 唯一索引(UNIQUE

    * 全文索引(FULLTEXT)(只在MyISAM存储引擎支持,在内容系统中用的多,在全英文网站用的多。中文数据不常用,意义不大,国内全文索引通常使用sphinx来完成,全文索引只能在charvarchartext字段创建)

    * 综合使用 => 复合索引

    3.1.5

    https://www.cnblogs.com/chenqionghe/p/4845693.html

    锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,出传统的计算资源(CPURAMI/O)的争用以外,数据也是一种供多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。

    概述

    相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。MySQL大致可归纳为以下3种锁:

    * 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

    * 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

    * 页面锁:开销和加锁时间介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发粒度一般。

    Mysql表级锁的锁模式(MyISAM),有两种:表共享锁(读锁,Table Read Lock)和表独占写锁(Table Write Lock)。

    * MyISAM的读操作,不会阻塞其他用户对同一表请求,但会阻塞对同一表的写请求;

    * MyISAM的写操作,则会阻塞其他用户对同一表的读和写操作;

    * MyISAM表的读操作和写操作之间,以及写操作之间都是串行的。

    当一个线程获得对一个表的写锁后,只有持有锁线程可以对表进行更新操作。其他线程的读、写操作都会等待,直到锁被释放为止。

    MySQL中的表锁兼容性

    当前锁模式/是否兼容/请求锁模式

    None

    读锁

    写锁

    读锁

    写锁

    可见,对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;

    MyISAM表的写操作,则会阻塞其他用户对同一表的读和写请求;

    MyISAM表的读和写操作之间,以及写和写操作之间是串行的。

    MyISAM表不会出现死锁的原因?

    不管是显式加锁还是自动加锁,mysql会一次获得SQL语句所需要的全部锁。

    一个session使用LOCK TABLE命令给表film_text加了读锁,这个session可以查询锁定表中的记录,但更新或访问其他表都会提示错误;

    同时,另外一个session可以查询表中的记录,但更新就会出现锁等待。

    当使用LOCK TABLE时,不仅需要一次锁定用到的所有表,而且,同一个表在SQL语句中出现多少次,就要通过与SQL语句中相同的别名锁多少次,否则也会出错。

    如何加表锁?

    MyISAM在执行查询语句(select)前,会自动给涉及的所有表加读锁,在执行更新操作(updatedeleteinsert等)前,会自动给涉及的表加写锁,这个过程并不需要用于干预,因此用户一般不需要直接用LOCK TABLE命令给MyISAM表显式加锁。

    并发锁

    在一定条件下,MyISAM也支持查询和操作的并发进行。

    MyISAM存储引擎有一个系统变量current_insert,专门用以控制其并发插入的行为,其值分别为0/1/2

    * concurrent_insert设置为0时,无论MyISAM的表数据文件中间是否存在因为删除而留下的空闲空间,不允许并发插入;

    * concurrent_insert设置为1时,如果MyISAM允许在一个读表的同时,另一个进程从表尾插入记录。这也是MySQL的默认配置。

    * concurrent_insert设置为2时,无论MyISAM表中有没有空闲空间,都允许在数据文件尾部并发插入记录。

    可以利用MyISAM存储引擎的并发插入特性,来解决应用中对同一表查询和插入锁争用。例如,将concurrent_insert系统变量为2,总是允许并发插入;同时,通过定期在系统空闲时段执行OPTIONMIZE TABLE语句来整理空闲碎片,收到因删除记录而产生的中间空间。

    MyISAM的锁调度

    前面讲过,MyISAM存储引擎的读和写锁是互斥的,读操作是串行的。那么,一个进程请求某个MyISAM表的读锁,同时另一个进程也请求同一表的写锁,MySQL如何处理?

    答案是写进程先获得锁。不仅如此,即使读进程先请求到锁等待队列,写请求后到,写锁也会插入到读请求之前!这事因为MySQL认为写请求一般比读请求重要。这也正式MyISAM表不太适合于有大量更新操作和查询操作应用的原因。因为,大量的更新操作会造成查询操作很难获得读锁,从而可能用于阻塞。这种情况有时可能会变得非常糟糕!幸好我们可以通过一些设置来调节MyISAM的调度行为。

    * 通过指定启动参数low-priority-updates,使MyISAM引擎默认给予读请求以优先的权利。

    * 通过执行命令SET LOW_PRIORITY_UPDATE=1,使该连接发出的更新请求优先级降低。

    * 通过指定INSERTUPDATEDELETE语句的LOW_PRIORITY属性,降低该语句的优先级。

    虽然上面3中方法都是要么更新优先,要么查询优先的方法,但是还是可以用其来解决查询相对重要的应用(如用户登录系统)中,读锁等待严重的问题。

    另外,MySQL也提供了一种折中的办法来调节读写冲突。即给系统参数max_write_lock_count设置一个合适的值,当一个表的读锁达到这个值后,mysql便暂时将写请求的优先级降低,给读进程一定获得锁的机会。

    3.1.6 Sphinx(斯芬克司,全文检索引擎)

    Sphinx是一个基于SQL的全文检索引擎,可以结合MySQLPostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。Sphinx特别为一些脚本语言设计搜索API接口,如PHPPythonPerlRuby等,同时为MySQL也设计了一个存储引擎插件。

    Sphinx单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级)。Sphinx创建索引的速度为:创建100万条记录的索引只需3~4分钟,创建1000万记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需要几十秒。

    Sphinx的主要特性包括:

    高速索引(在新款CPU上,近10MB/秒);

    高速搜索(2-4G的文本量中平均查询速度不到0.1秒);

    高可用性(单CPU上最大支持100GB的文本,100M文档);

    提供良好的相关性排名,支持分布式搜索;

    提供文档摘要生成;

    提供从MySQL内部的插件式存储引擎上搜索,支持布尔、短语、和近义词查询;

    支持每个文档多个全文检索域(默认最大32个);

    支持每个文档多属性;

    支持断词;

    支持单字节编码与UTF-8编码。

    3.1.7

    3.1.8

    3.1.9

    3.1.10

    四、apachenginx

    五、shell脚本,常用linux服务器维护命令

     

     

     

     

  • 相关阅读:
    CF938E Max History
    经典论文系列 | 目标检测--CornerNet & 又名 anchor boxes的缺陷
    在 Intenseye,为什么我们选择 Linkerd2 作为 Service Mesh 工具(Part.2)
    在 Intenseye,为什么我们选择 Linkerd2 作为 Service Mesh 工具(Part.1)
    Java概述
    算法 --- 二分法 冒泡排序 递归 快速排序
    二维数组
    数组
    SNMP "Simple Network Management Protocol" "简单网络管理协议"。
    常用api --- BigDecimal 包装类 Integer Arrays
  • 原文地址:https://www.cnblogs.com/sandaizi/p/8528125.html
Copyright © 2011-2022 走看看