PHP面试Mysql篇
一.MySQL中innodb与myisam的区别:
1.InnoDB支持事务,MyISAM不支持事务
2.InnoDB支持行级锁和表级锁,页锁,MyISAM仅支持表级锁
3.InnoDB支持MVCC, MyISAM不支持
4.InnoDB支持外键,MyISAM不支持
5.InnoDB不支持全文索引,MyISAM支持
5.InnoDB删除,插入,更新数据效率更高,MyISAM查询数据效率高
6.MySQL的默认引擎:myisam
二.innodb与myisam select count(*)效率高
myisam,因为myisam内部维护了一个计数器,可以直接调取。
三.varchar与char的区别:
char是一种固定长度的类型,长度不够会自动补充,varchar则是一种可变长度的类型
四.innodb引擎的4大特性:
1.插入缓冲(insert buffer),
2.二次写(double write),
3.自适应哈希索引(ahi),
4.预读(read ahead)
五.innodb的事务隔离级别与日志的实现方式:
事务的4种隔离级别:读未提交(RU);读已提交(RC);可重复读(RR);串行
六.日志种类:
错误日志:记录出错信息,也记录一些警告信息或者正确的信息。
查询日志:记录所有对数据库请求的信息,不论这些请求是否得到了正确的执行。
慢查询日志:设置一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询的日志文件中。
二进制日志:记录对数据库执行更改的所有操作。
中继日志:
事务日志:
七.事务是如何通过日志来实现的:
事务日志是通过redo和innodb的存储引擎日志缓冲(Innodb log buffer)来实现的,
当开始一个事务的时候,会记录该事务的lsn(log sequence number)号;
当事务执行时,会往InnoDB存储引擎的日志的日志缓存里面插入事务日志;当事务提交时,
必须将存储引擎的日志缓冲写入磁盘(通过innodb_flush_log_at_trx_commit来控制),
也就是写数据前,需要先写日志。这种方式称为“预写日志方式”
八.binlog的几种日志录入格式以及区别:
Statement:每一条会修改数据的sql都会记录在binlog中;
优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。
缺点:由于记录的只是执行语句,为了这些语句能在slave上正确运行,
因此还必须记录每条语句在执行的时候的一些相关信息,
以保证所有语句能在slave得到和在master端执行时候相同的结果。Row:不记录sql语句上下文相关信息,仅保存哪条记录被修改。
优点:binlog中可以不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。
所以rowlevel的日志内容会非常清楚的记录下每一行数据修改的细节。
缺点:所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,
这样可能会产生大量的日志内容;Mixed:是以上两种level的混合使用,一般的语句修改使用statment格式保存binlog,
如一些函数,statement无法完成主从复制的操作,则 采用row格式保存binlog,
MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式
九.MySQL数据库cpu飙升到500%怎么处理:
列出所有进程 show processlist,观察所有进程多秒没有状态变化的(kill);
十.InnoDB引擎的行锁是通过加在什么上实现:
InnoDB是基于索引来完成行锁,没有通过索引将会表锁。
十一.mysql主从一致性校验:
checksum、mysqldiff、pt-table-checksum等工具
十二.索引类型:
主键索引: 数据列不允许重复,不允许为NULL,一个表只能有一个主键。
唯一索引: 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。
普通索引: 基本的索引类型,没有唯一性的限制,允许为NULL值。
全文索引:是目前搜索引擎使用的一种关键技术。
十三.索引的数据结构和区别:B+树索引(InnoDB默认),Hash索引
1.hash索引进行等值查询更快(一般情况下),但是却无法进行范围查询。
2.hash索引不支持使用索引进行排序
3.hash索引不支持模糊查询以及多列索引的最左前缀匹配
4.hash索引任何时候都避免不了回表查询数据,而B+树在符合某些条件(聚簇索引,覆盖索引等)的时候
可以只通过索引完成查询。
5.hash索引虽然在等值查询上较快,但是不稳定。性能不可预测,当某个键值存在大量重复的时候,
发生hash碰撞,此时效率可能极差。而B+树的查询效率比较稳定,对于所有的查询都是从根节点到叶子节点,
且树的高度较低。
十四.什么是事务的四大特性(ACID)
原子性(Atomicity):事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
一致性(Consistency):执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;
隔离性(Isolation):并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
持久性(Durability):一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
十五.Mysql如何为表字段添加索引?
1.添加PRIMARY KEY(主键索引)
alter table table_name add primary key (column)
2.添加UNIQUE(唯一索引)
alter table table_name add unique (column)
3.添加INDEX(普通索引)
alter table table_name add index index_name (column)
4.添加FULLTEXT(全文索引)
alter table table_name add fulltext (column)
5.添加多列索引
alter table table_name add index index_name (column1,column2,column3)
十六.如何进行大表优化?
1.限定数据的范围。禁止不带任何限制数据范围条件的查询语句。比如:我们当用户在查询订单历史的时候,我们可以控制在一个月的范围内;
2.读/写分离。经典的数据库拆分方案,主库负责写,从库负责读;
3.垂直分区。根据数据库里面数据表的相关性进行拆分。例如,用户表中既有用户的登录信息又有用户的基本信息,可以将用户表拆分成两个单独的表,甚至放到单独的库做分库。简单来说垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表。
垂直拆分的优点:可以使得列数据变小,在查询时减少读取的Block数,减少I/O次数。此外,垂直分区可以简化表的结构,易于维护。
垂直拆分的缺点:主键会出现冗余,需要管理冗余列,并会引起Join操作,可以通过在应用层进行Join来解决。此外,垂直分区会让事务变得更加复杂;
4.水平分区。保持数据表结构不变,通过某种策略存储数据分片。这样每一片数据分散到不同的表或者库中,达到了分布式的目的。水平拆分可以支撑非常大的数据量。
水平拆分是指数据表行的拆分,表的行数超过200万行时,就会变慢,这时可以把一张的表的数据拆成多张表来存放。举个例子:我们可以将用户信息表拆分成多个用户信息表,这样就可以避免单一表数据量过大对性能造成影响
。水平拆分可以支持非常大的数据量。需要注意的一点是:分表仅仅是解决了单一表数据过大的问题,但由于表的数据还是在同一台机器上,其实对于提升MySQL并发能力没有什么意义,所以 水平拆分最好分库 。
水平拆分能够支持非常大的数据量存储,应用端改造也少,但分片事务难以解决 ,跨节点Join性能较差,逻辑复杂。尽量不要对数据进行分片,因为拆分会带来逻辑、部署、运维的各种复杂度 ,
一般的数据表在优化得当的情况下支撑千万以下的数据量是没有太大问题的。如果实在要分片,尽量选择客户端分片架构,这样可以减少一次和中间件的网络I/O。
十七.分库分表之后,id主键如何处理?
因为要是分成多个表之后,每个表都是从 1 开始累加,这样是不对的,我们需要一个全局唯一的 id 来支持。
生成全局 id 有下面这几种方式:
UUID:不适合作为主键,因为太长了,并且无序不可读,查询效率低。比较适合用于生成唯一的名字的标示比如文件的名字。
数据库自增 id : 两台数据库分别设置不同步长,生成不重复ID的策略来实现高可用。这种方式生成的 id 有序,但是需要独立部署数据库实例,成本高,还会有性能瓶颈。
利用 redis 生成 id : 性能比较好,灵活方便,不依赖于数据库。但是,引入了新的组件造成系统更加复杂,可用性降低,编码更加复杂,增加了系统成本。
美团的Leaf分布式ID生成系统 :Leaf 是美团开源的分布式ID生成器,能保证全局唯一性、趋势递增、单调递增、信息安全,里面也提到了几种分布式方案的对比,但也需要依赖关系数据库、Zookeeper等中间件。感觉还不错。
十八、MySQL优化
1.开启查询缓存,优化查询explain你的select查询,这可以帮你分析你的查询语句或是表结构的性能瓶颈。
EXPLAIN 的查询结果还会告诉你你的索引主键被如何利用的,你的数据表是如何被搜索和排序的。
当只要一行数据时使用limit 1,MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据。
2.为搜索字段添加索引
3.优化字段的数据类型
4.数据库表结构的优化
5.选择正确的存储引擎
6.尽可能的使用 NOT NULL
7.垂直分表
8.SQL语句及索引的优化
9.系统配置的优化
十九、如何设计一个高并发的系统
1.数据库的优化,包括合理的事务隔离级别、SQL语句优化、索引的优化
2.使用缓存,尽量减少数据库 IO
3.分布式数据库、分布式缓存
4.服务器的负载均衡
二十、了解XSS攻击吗?如何防止?
XSS是跨站脚本攻击,首先是利用跨站脚本漏洞以一个特权模式去执行攻击者构造的脚本,然后利用不安全的Activex控件执行恶意的行为。
使用htmlspecialchars()函数对提交的内容进行过滤,使字符串里面的特殊符号实体化。
二十一、SQL注入漏洞产生的原因?如何防止?
SQL注入产生的原因:程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行。
防止SQL注入的方式:
1.开启配置文件中的magic_quotes_gpc 和 magic_quotes_runtime设置
2.执行sql语句时使用addslashes进行sql语句转换
3.Sql语句书写尽量不要省略双引号和单引号。
4.过滤掉sql语句中的一些关键词:update、insert、delete、select、 * 。
5.提高数据库表和字段的命名技巧,对一些重要的字段根据程序的特点命名,取不易被猜到的。
6.Php配置文件中设置register_globals为off,关闭全局变量注册
7.控制错误信息,不要在浏览器上输出错误信息,将错误信息写到日志文件中。
二十二、什么情况下设置了索引但无法使用
1. 以“%”开头的LIKE语句,模糊匹配
2.OR语句前后没有同时使用索引
3.数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型)
二十三、索引的目的是什么?
1.快速访问数据表中的特定信息,提高检索速度
2.创建唯一性索引,保证数据库表中每一行数据的唯一性。
3.加速表和表之间的连接
4.使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间二十四、索引对数据库系统的负面影响是什么?
创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;
索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;
当对表进行增、删、改、的时候索引也要动态维护,这样就降低了数据的维护速度。二十五、为数据表建立索引的原则有哪些?
1.在最频繁使用的、用以缩小查询范围的字段上建立索引
2.在频繁使用的、需要排序的字段上建立索引二十六、什么情况下不宜建立索引?
1.对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引。
2.对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等
二十七、什么是视图?有什么优点?
视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,视图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。
(1) 视图能够简化用户的操作
(2) 视图使用户能以多种角度看待同一数据;
(3) 视图为数据库提供了一定程度的逻辑独立性;
(4) 视图能够对机密数据提供安全保护。
二十八、什么是锁?
数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。
基本锁类型:锁包括行级锁和表级锁。
二十九、连接mysql,增删改查
$localname="localhost";
$username="root";
$password="";
$dbname='jl_db';
$link=mysqli_connect($localname,$username,$password,$dbname);
//增
$sql="insert into `table`(xuehao,password,email) value ('123','456','123@qq.com')";
if(mysqli_query($link,$sql)==TRUE) echo("插入成功");//删
$sql = "delete from table where id='1'";
$row = $link->query($sql);
if ($row) echo '删除成功';//改
$sql = "update table set email='456@qq.com' where id='1'";
$row = $link->query($sql);
if ($row)echo '邮箱修改成功';//查
$sql = "select * from table where xuehao='123'";
$result = $link->query($sql);
$result=mysqli_fetch_assoc($result);
PHP面试Mysql篇相关推荐
- 面试:MySQL篇,详尽知识点总结
面试:MySQL篇 本篇文章是本人在结合书籍和博客并结合个人理解总结的相对完全的MySQL面试知识点,部分内容在下方给出参考博客的链接和书籍,以供读者进行参考和深入的理解该部分知识点,针对部分知识点可 ...
- mysql数据库调优 面试_面试-MySQL篇:数据库调优
今天谈谈 MySQL 的调优问题,比较偏项目实战.面试中也喜欢问 "xxx如何优化"的问题,这类问题相对开放,一不小心就变成了送命题,但是风险与机遇并存,假如你能理论结合项目经验给 ...
- java面试-MySQL篇分库分表策略
1.数据库的三范式是什么 第一范式:列不可再分 第二范式:行可以唯一区分,主键约束 第三范式:表的非主属性不能依赖与其他表的非主属性 外键约束 且三大范式是一级一级依赖的,第二范式建立在第一范式上,第 ...
- PHP面试MySQL数据库的索引
你好,是我琉忆,PHP程序员面试笔试系列图书的作者. 本周(2019.3.4至3.8)的一三五更新的文章如下: 周一:PHP面试MySQL数据库的基础知识 周三:PHP面试MySQL数据库的索引 周五 ...
- laravel mysql sum查询并排行_必看!PHP常见面试题——MySQL篇(二)
接上期:<必看!PHP常见面试题--MySQL篇(一)> 11.MySQL的默认事务隔离级别是? 读未提交(RU): 一个事务还没提交时, 它做的变更就能被别的事务看到. 读提交(RC): ...
- Mysql索引数据结构有多个选择,为什么一定要是B+树呢?_面试 (MySQL 索引为啥要选择 B+ 树)
Mysql索引数据结构 下面列举了常见的数据结构 二叉树 红黑树 Hash表 B-Tree(B树) Select * from t where t.col=5 我们在执行一条查询的Sql语句时候,在数 ...
- 技术面试(上):面试官篇
作为一个技术团队管理者,面试是一项必不可少的工作:作为一个上班族,被面试也是必然会一而再再而三经历的事情. 不过在我的经验中,很多人(包括曾经的自己)不太会面试这件事,或者说不太重视这件事.面试官认为 ...
- openresty 前端开发入门五之Mysql篇
2019独角兽企业重金招聘Python工程师标准>>> openresty 前端开发入门五之Mysql篇 这章主要演示怎么通过lua连接mysql,并根据用户输入的name从mysq ...
- aws java mysql_AWS Serverless部署java api(RDS for MySQL篇)
AWS Serverless部署java api(RDS for MySQL篇) l Amazon API GATEWAY l Amazon LAMBDA l Amazon RDS for MySQL ...
最新文章
- CV技术在医疗领域中有哪些应用?Salesforce、谷歌、斯坦福综述文章登上Nature子刊...
- Packet tracer软件安装,模拟网络搭建【Packet tracer安装和使用】
- QT的QApplication类的使用
- JavaScript内存泄漏知多少?
- iphone7配置_iphone7黑屏开不了机怎么办
- python3.8.3好用吗_python使用3.8.3版本,存在报错
- pytorch——张量操作与线性回归
- 黑客走开系列1:Python使用元组做函数实参让代码更安全!
- 通过CSS,Jquery实现DIV的各种动作(包括漂移,未测试IE6)
- ISA Server 2004服务器发布DHCP服务器
- wifinative.java_AndroidQ Wifi打开流程(二)
- nbu备份脚本 linux,NBU60网络备份大全之Linux设备管理(参考Word)
- 4款开源的中文分词系统
- guide, manual, tutorial之间的区别
- linux centos 架构,CentOS Linux 7.5 (build 1804) 现可用于IBM POWER9体系架构
- 黑群晖的驱动加载与卸载(以USB网卡驱动为例)
- iphone游戏开发(转)
- Linux第六章课后题
- php detailview,PHP开发框架Yii Framework教程(31) Zii组件-DetailView示例
- 西安电大计算机文化基础中考,计算机文化基础试题3.pdf
热门文章
- 云操作系统发展提速,助力实现国家信息安全
- 腾讯QQ/TM珊瑚虫外挂 2.3.4 QQ IP数据库
- 踩个脚印,记录一个短小精干的消息队列的项目地址
- 【Python游戏】Python各大游戏合集(3):飞翔的小鸟、俄罗斯方块、24点小游戏、吃豆豆小游、扫雷 | 附带源码
- 哪里有免费硬盘恢复数据软件下载
- Speak2Me:社会性线上英语交流系统
- 网上购物商城系统设计与实现
- C++循环---买房子(自学用)
- gif文件在linux下怎么打开,gif文件扩展名,gif文件怎么打开?
- linux编辑器java_Java编辑器 BlueJ For Linux V3.1.6 免费版 下载-脚本之家