PHP工程师必备知识整理
一、http/https协议,tcp/ip协议,websocket,session,cookie
二、php:oop,thinkphp5,laravel
三、mysql、memcache、redis
3.1 mysql面试题目
3.1.1 MySQL的复制原理以及流程
3.1.2 char和varchar的区别?
* char用于存放固定长度的字符串,长度最大为255,比指定长度大的值将被截断,而比指定长度小的值将会用空格进行填补。
* varchar用于保存可变长度的字符串,长度最大为65535,只存储字符串实际需要的长度,它会增加一个额外字节来保存字符串本身的长度,varchar使用额外的1~2字节来存储值的长度。如果列的最大长度小于或等于255,则使用1字节,否则使用2字节。
* char和varchar跟字符编码也有密切联系,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=’FILE,TABLE’。
日志记录到系统的专用日志表中,要比记录到文件耗费更多的系统资源,因此对于需要启用慢查询日志,又需要能获得更高的系统性能,建议优先记录到文件。
* log-query-not-using-indexes:
未使用索引的查询也被记录到慢查询日志中(可选项)。如果调优的话,建议开启这个选项。另外,开启了这个参数,其实使用full index scan的sql也会被记录到慢查询日志。
* log_slow_admin_statements:
表示是否将慢管理语句例如ANALYZE TABLE和ALTER TABLE等记录慢查询日志。
* 分析工具mysqldumpslow -- 慢查询分析工具
3.1.4 索引的类型
* 主键索引,主键自动的为主索引(类型Primary)
* 唯一索引(UNIQUE)
* 全文索引(FULLTEXT)(只在MyISAM存储引擎支持,在内容系统中用的多,在全英文网站用的多。中文数据不常用,意义不大,国内全文索引通常使用sphinx来完成,全文索引只能在char、varchar、text字段创建)
* 综合使用 => 复合索引
3.1.5 锁
https://www.cnblogs.com/chenqionghe/p/4845693.html
锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,出传统的计算资源(CPU、RAM、I/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)前,会自动给涉及的所有表加读锁,在执行更新操作(update、delete、insert等)前,会自动给涉及的表加写锁,这个过程并不需要用于干预,因此用户一般不需要直接用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,使该连接发出的更新请求优先级降低。
* 通过指定INSERT、UPDATE、DELETE语句的LOW_PRIORITY属性,降低该语句的优先级。
虽然上面3中方法都是要么更新优先,要么查询优先的方法,但是还是可以用其来解决查询相对重要的应用(如用户登录系统)中,读锁等待严重的问题。
另外,MySQL也提供了一种折中的办法来调节读写冲突。即给系统参数max_write_lock_count设置一个合适的值,当一个表的读锁达到这个值后,mysql便暂时将写请求的优先级降低,给读进程一定获得锁的机会。
3.1.6 Sphinx(斯芬克司,全文检索引擎)
Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。Sphinx特别为一些脚本语言设计搜索API接口,如PHP、Python、Perl、Ruby等,同时为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
四、apache、nginx
五、shell脚本,常用linux服务器维护命令
上一篇: javascript中的数据类型
下一篇: 常见的DOM操作有哪些
推荐阅读
-
PHP/Javascript/CSS/jQuery常用知识大全详细整理第1/2页
-
MySQL必备的常见知识点汇总整理
-
Oracle RAC必备知识点整理
-
PHP/Javascript/CSS/jQuery常用知识大全详细整理第1/2页
-
整理收藏一份PHP高级工程师的笔试题
-
php日期,时间有关知识整理
-
php日期,时间相关知识整理,
-
韩顺平_PHP软件工程师玩转算法公开课(第一季)01_算法重要性_五子棋算法_汉诺塔_回溯算法_学习笔记_源代码图解_PPT文档整理
-
整理了一份招PHP高级工程师的面试题,php高级工程师
-
韩顺平_PHP软件工程师玩转算法公开课(第一季)01_算法重要性_五子棋算法_汉诺塔_回溯算法_学习笔记_源代码图解_PPT文档整理