mysql面试题
防止SQL注入的方式:
开启配置文件中的magic_quotes_gpc 和 magic_quotes_runtime设置
执行sql语句时使用addslashes进行sql语句转换
Sql语句书写尽量不要省略双引号和单引号。
过滤掉sql语句中的一些关键词:update、insert、delete、select、 * 。
提高数据库表和字段的命名技巧,对一些重要的字段根据程序的特点命名,取不易被猜到的。
Php配置文件中设置register_globals为off,关闭全局变量注册
Mysql 的存储引擎,myisam和innodb的区别。
1.MyISAM 是非事务的存储引擎,适合用于频繁查询的应用。表锁,不会出现死锁,适合小数据,小并发。
2.innodb是支持事务的存储引擎,合于插入和更新操作比较多的应用,设计合理的话是行锁(最大区别就在锁的级别上),适合大数据,大并发。
MyISAM Innodb
事物支持 : 不支持 支持
锁的粒度: table Row
存储容量: 没有上限 64TB
哈希索引 : 不支持 支持
全文索引: 支持 不支持
外键: 不支持 支持
Mysql各种索引区别
普通索引:最基本的索引,没有任何限制
唯一索引:与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。
主键索引:它 是一种特殊的唯一索引,不允许有空值。
全文索引:仅可用于 MyISAM 表,针对较大的数据,生成全文索引很耗时好空间。
组合索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则。创建复合索引时应该将最常用(频率)作限制条件的列放在最左边,依次递减。组合索引最左字段用in是可以用到索引的,最好explain一下select。
导致sql语句执行慢的原因?怎么优化?
原因:
1.硬件问题。如网络速度慢,内存不足,I/O吞吐量小,磁盘空间满了等。
2.没有索引或者索引失效。(一般在互联网公司,DBA会在半夜把表锁了,重新建立一遍索引,因为当你删除某个数据的时候,索引的树结构就不完整了。所以互联网公司的数据做的是假删除.一是为了做数据分析,二是为了不破坏索引 )
3.数据过多(分库分表)
4.服务器调优及各个参数设置(调整my.cnf)
优化:
1.先观察,开启慢查询日志,设置相应的阈值(比如超过3秒就是慢SQL),在生产环境跑上个一天过后,看看哪些SQL比较慢。
2.Explain和慢SQL分析。比如SQL语句写的烂,索引没有或失效,关联查询太多(有时候是设计缺陷或者不得以的需求)等等
3.Show Profile是比Explain更近一步的执行细节,可以查询到执行每一个SQL都干了什么事,这些事分别花了多少秒
4.找DBA或者运维对MySQL进行服务器的参数调优。
什么是事务,事务的特性?
事务是由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行。程序和事务是两个不同的概念。一般而言:一段程序中可能包含多个事务。(说白了就是几步的数据库操作而构成的逻辑执行单元)
事务具有四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持续性(Durability)。这四个特性也简称ACID性。
(1)原子性:事务是应用中最小的执行单位,就如原子是自然界最小颗粒,具有不可再分的特征一样。事务是应用中不可再分的最小逻辑执行体。(最小了,不可再分了)
(2)一致性:事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库中只包含事务成功提交的结果时,数据库处于一致性状态。一致性是通过原子性来保证的。(说罢了就是白狗变成了黑狗,不能出现斑点狗!)
(3)隔离性:各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务,都是隔离的。也就是说:并发执行的事务之间不能看到对方的中间状态,并发执行的事务之间不能相互影响。(说白了,就是你做你的,我做我的!)
(4)持续性:持续性也称为持久性,指事务一旦提交,对数据所做的任何改变,都要记录到永久存储器中,通常是保存进物理数据库。(说白了就是一条道跑到黑
MySQL 的复制原理以及流程
(1)、复制基本原理流程
1. 主:binlog 线程——记录下所有改变了数据库数据的语句,放进master 上的binlog 中;
2. 从:io 线程——在使用start slave 之后,负责从master 上拉取binlog 内容,放进自己的relay log 中;
3. 从:sql 执行线程——执行relay log 中的语句;
(2)、MySQL 复制的线程有几个及之间的关联 MySQL 的复制是基于如下3 个线程的交互( 多线程复制里面应该是4 类线程):
1. Master 上面的binlog dump 线程,该线程负责将master 的binlog event 传到slave;
2. Slave 上面的IO 线程,该线程负责接收Master 传过来的binlog,并写入relay log;
3. Slave 上面的SQL 线程,该线程负责读取relay log 并执行;
4. 如果是多线程复制,无论是5.6 库级别的假多线程还是MariaDB 或者5.7 的真正的多线程复制, SQL 线 程只做coordinator,只负责把relay log 中的binlog 读出来然后交给worker 线程, woker 线程负 责具体binlog event 的执行
mysql主从数据一致性?
mysql备份数据的一致性?
mysql binlog的几种日志录入格式以及区别?
(1)各种日志格式的涵义
(2)适用场景
(3)结合第一个问题,每一种日志格式在复制中的优劣
备份计划,mysqldump以及xtranbackup的实现原理?
mysqldump是最简单的逻辑备份方式。在备份myisam表的时候,如果要得到一致的数据,就需要锁表,简单而粗暴。而在备份innodb表 的时候,加上–master-data=1 –single-transaction 选项,在事务开始时刻,记录下binlog pos点,然后利用mvcc来获取一致的数据,由于是一个长事务,在写入和更新量很大的数据库上,将产生非常多的undo,显著影响性能,所以要慎用 优点:简单,可针对单表备份,在全量导出表结构的时候尤其有用。 缺点:简单粗暴,单线程,备份慢而且恢复慢,跨IDC有可能遇到时区问题
xtrabackup它实际上是物理备份+逻辑备份的组合。在备份 innodb表的时候,它拷贝ibd文件,并一刻不停的监视redo log的变化,append到自己的事务日志文件。在拷贝ibd文件过程中,ibd文件本身可能被写”花”,这都不是问题,因为在拷贝完成后的第一个 prepare阶段,Xtrabackup采用类似于innodb崩溃恢复的方法,把数据文件恢复到与日志文件一致的状态,并把未提交的事务回滚。如果同 时需要备份myisam表以及innodb表结构等文件,那么就需要用flush tables with lock来获得全局锁,开始拷贝这些不再变化的文件,同时获得binlog位置,拷贝结束后释放锁,也停止对redo log的监视。
(1) 备份计划
(2)备份恢复时间
(3)备份恢复失败如何处理
mysql把一个大表拆分多个表后,如何解决跨表查询效率问题?
浙公网安备 33010602011771号