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服务器维护命令
PHP工程师必备知识整理的更多相关文章
- MySQL常用指令,java,php程序员,数据库工程师必备。程序员小冰常用资料整理
MySQL常用指令,java,php程序员,数据库工程师必备.程序员小冰常用资料整理 MySQL常用指令(备查) 最常用的显示命令: 1.显示数据库列表. show databases; 2.显示库中 ...
- Kali Linux渗透基础知识整理(四):维持访问
Kali Linux渗透基础知识整理系列文章回顾 维持访问 在获得了目标系统的访问权之后,攻击者需要进一步维持这一访问权限.使用木马程序.后门程序和rootkit来达到这一目的.维持访问是一种艺术形式 ...
- 数据库知识整理<一>
关系型数据库知识整理: 一,关系型数据库管理系统简介: 1.1使用数据库的原因: 降低存储数据的冗余度 提高数据的一致性 可以建立数据库所遵循的标准 储存数据可以共享 便于维护数据的完整性 能够实现数 ...
- 【转载】UML类图知识整理
原文:UML类图知识整理 UML类图 UML,进阶必备专业技能,看不懂UML就会看不懂那些优秀的资料. 这里简单整理 类之间的关系 泛化关系(generalization) 泛化(generalize ...
- Java面试必备知识
JAVA面试必备知识 第一,谈谈final, finally, finalize的区别. 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可 ...
- 【OGG】OGG基础知识整理
[OGG]OGG基础知识整理 一.GoldenGate介绍 GoldenGate软件是一种基于日志的结构化数据复制软件.GoldenGate 能够实现大量交易数据的实时捕捉.变换和投递,实现源数据库与 ...
- Salesforce知识整理(一)之Lightning Web Component Tools
目录 LWC知识整理(一) 工具 Salesforce CLI Visual Studio Code(VS Code) Developer Hub(Dev Hub) 开启Dev Hub 相关资料 茶余 ...
- Java工程师必备
Java工程师必备 JAVA基础扎实,熟悉JVM,熟悉网络.多线程.分布式编程及性能调优 精通Java EE相关技术 熟练运用Spring/SpringBoot/MyBatis等基础框架 熟悉分布式系 ...
- [面试]中高级测试工程师必备,月薪15K+
1.你的测试职业发展是什么? 测试经验越多,测试能力越高.所以我的职业发展是需要时间积累的,一步步向着高级测试工程师奔去.而且我也有初步的职业规划,前3年积累测试经验,按如何做好测试工程师的要点去要求 ...
随机推荐
- Mybatis插入记录并返回MySQL自增主键
mapper Integer insertConfigAndGetId(CrawlerConfig config); xml <insert id="insertConfigAndGe ...
- Windows —— cmd命令
Windows —— cmd命令 cd 命令 进入cmd的默认目录:默认为 C:\Users\Administrator> 进入文件夹:cd 文件夹名 返回上一层目录:cd.. 切换目录: 清屏 ...
- 微信小程序 加载图片时,先拉长,再恢复正常
今天在写小程序,发现小程序的图片image如过mode设置为widthFix的话, 加载图片会被先拉伸,后恢复正常 我的处理方法是,给他一个初始的height值,或者就直接 height:auto
- 【长文】Google面试官分步解析自己泄漏前的面试题,超多干货和建议
本文翻译自Google工程师/面试官Alex Golec的文章:Google Interview Questions Deconstructed: The Knight's Dialer:翻译:实验楼 ...
- Linux给MySQL创建用户,并分配权限
//登录MYSQL 使用root账号登录 @>mysql -u root -p @>密码 //创建用户 mysql> insert into mysql.user(Host,User ...
- leetcode143. Reorder List
用快慢双指针,可以使慢指针到达中间的时候快指针到达最后一个元素(奇数),或者倒数第二个元素(偶数).慢指针后面的元素是后半个链表,把后半个链表进行reverse,然后再插在原来的链表中就可以了 /** ...
- 用python脚本获取运行环境中的module 列表
由于脚本运行在远程环境,总报错说一些module没有.所以决定彻底对环境进行一次摸底. 于是,用如下代码即可实现: #!/usr/bin/env python import sys try: #pri ...
- mybatis增强
MyBatis SQL参数传递(掌握) SQL映射器Mapper接口(掌握)Myb atis批量操作(理解掌握) (多对一)关联映射(掌握) (一对多,多对多)集合映射 MyBatis原理回顾(Obj ...
- 安装mongodb服务
摘要:https://www.cnblogs.com/z-x-y/p/9305635.html 欢迎转载,转载请标明出处:https://www.cnblogs.com/z-x-y/p/9305635 ...
- PeopleSoft底层表,闪存查找历史代码(不小心改)
Oracle 闪存查找历史代码 select * from (SELECT * FROM PSPCMTXT AS OF TIMESTAMP to_timestamp('20180725 1 ...