mysql常见函数⾯试题_MySQL常见⾯试题
1、MySQL常见数据库引擎及⽐较?
sql查询面试题及答案答:InnoDB:⽀持事务处理,⽀持外键,⽀持崩溃修复能⼒和并发控制。如果需要对事务的完整性要求⽐较⾼(⽐如银⾏),要求实现并发控制(⽐如售票),那选择InnoDB有很⼤的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为⽀持事务的提交(commit)和回滚(rollback)。
MyISAM:插⼊数据快,空间和内存使⽤⽐较低。如果表主要是⽤于插⼊新记录和读出记录,那么选择MyISAM能实现处理⾼效率。如果应⽤的完整性、并发性要求⽐较低,也可以使⽤。
MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不⾼。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的⼤⼩有要求,不能建⽴太⼤的表。所以,这类数据库只使⽤在相对较⼩的数据库表。
注意,同⼀个数据库也可以使⽤多种存储引擎的表。如果⼀个表要求⽐较⾼的事务处理,可以选择InnoDB。这个数据库中可以将查询要求⽐较⾼的表选择MyISAM存储。如果该数据库需要⼀个⽤于查询的临时表,可以选择MEMORY存储引擎。
2、什么是事务?MySQL如何⽀持事务?
答:原⼦性、⼀致性、隔离性、持久性
在mysql中⽤的最多的存储引擎有:innodb,bdb,myisam
,memory 等。
其中innodb和bdb⽀持事务⽽myisam等不⽀持事务。
3、索引类型:FULLTEXT,HASH,BTREE,RTREE。
4、MySQL索引种类
实际上,索引也是⼀张表,该表保存了主键与索引字段,并指向实体表的记录。
答:1.普通索引2.唯⼀索引3.主键索引4.组合索引5.全⽂索引
5、索引在什么情况下遵循最左前缀的规则?
答:最左前缀原理的⼀部分,索引index1:(a,b,c),只会⾛a、a,b、a,b,c
三种类型的查询,其实这⾥说的有⼀点问题,a,c也⾛,但是只⾛a字段索引,不会⾛c字段。
索引是有序的,index1索引在索引⽂件中的排列是有序的,⾸先根据a来排序,然后才是根据b来排序,最后是根据c来排序。
13、列举
创建索引但是⽆法命中索引的情况。
答:1) 索引本⾝失效
2) 没有查询条件,或者查询条件没有建⽴索引
3) 在查询条件上没有使⽤引导列
4) 对⼩表查询
5) 查询的数量是⼤表中的⼤部分数据。
5)对列使⽤函数,该列的索引将不起作⽤。如:substring(字段名,1,2)='xxx';
6)对列进⾏运算(+,-,*,/,!
等),该列的索引将不起作⽤。
如:select * from test where
id-1=9;//错误的写法
select * from test where
id=10; //正确的写法
7)某些情况下的LIKE操作,该列的索引将不起作⽤。如:字段名LIKE
CONCAT('%', '2014 - 08 - 13', '%')
8)某些情况使⽤反向操作,该列的索引将不起作⽤。如:字段名<> 2
9)在WHERE中使⽤OR时,有⼀个列没有索引,那么其它列的索引将不起作⽤
10)隐式转换导致索引失效。由于表的字段t_number定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给Oracle,这样会导致索引失效。
如:
select * from test where t_number=133********;
//错误的写法
select * from test where
t_number='133********'; //正确的写法
11)使⽤not
in ,not exist等语句时
12)当变量采⽤的是times变量,⽽表的字段采⽤的是date变量时.或相反情况。
13)当B-tree索引
is null不会失效,使⽤is
not null时,会失效,位图索引
is null,is not null 都会失效。
14)联合索引
is not null 只要在建⽴的索引列(不分先后)都会失效。
14、如何开启慢⽇志查询?
答:MySQL的慢查询⽇志是MySQL提供的⼀种⽇志记录,它⽤来记录在MySQL中响应时间超过阀值的语句,具体指运⾏时间超过
long_query_time值的SQL,则会被记录到慢查询⽇志中。long_query_time的默认值为10,意思是运⾏10S以上的语句。默认情况
下,Mysql数据库并不启动慢查询⽇志,需要我们⼿动来设置这个参数,当然,如果不是调优需要的话,⼀般不建议启动该参数,因为开启慢查询⽇志会或多或少带来⼀定的性能影响。慢查询⽇志⽀持将⽇志记录写⼊⽂件,也⽀持将⽇志记录写⼊数据库表。slow_query_log
=1
slow_query_log_file=/application/mysql/data/localhost-slow.log
long_query_time = 1
15、数据库优化⽅案?
答:
优化之前先开启慢查询⽇志,并通过explain进⾏分析。然后对sql及索引进⾏优化。必要的时候对数据结构,数据类型进⾏优化。
MySql提供了EXPLAIN语法⽤来进⾏查询分析,在SQL语句前加⼀个"EXPLAIN"即可
16、1000w条数据,使⽤limit
offset 分页时,为什么越往后翻越慢?如何解决?
答: 先查主键,在分页。 select * from tb where id
in(select
id from tb where limit 10 offset 20)
23、简述数据库主从复制(Master-Slave)和读写分离(MySql-Proxy)?
答:主从复制
配置Master主服务器
1)在Master
MySQL上创建⼀个⽤户‘repl’,并允许其他Slave服务器可以通过远程访问Master,通过该⽤户读取⼆进制⽇志,实现数据同步。
2)到MySQL安装⽂件夹修改my.Ini⽂件。mysql中有好⼏种⽇志⽅式,我们只要启动⼆进制⽇志log-bin就ok。
配置Slave从服务器(windows)
1)配置MySQL安装⽂件夹修改my.ini⽂件
2)连接Master,执⾏sql
3)启动Slave
读写分离
数据库Master主服务器:192.168.10.130
数据库Slave从服务器:192.168.10.131
MySQL-Proxy调度服务器:192.168.10.132
MySQL-Proxy的读写分离主要是通过rw-splitting.lua脚本实现的,因此需要安装lua。
1.当MySQL主从复制在
show slave status\G 时出现Slave_IO_Running或Slave_SQL_Running
的值不为YES时,需要⾸先通过
stop slave 来停⽌从服务器,然后再执⾏⼀次本⽂,但如果想尽可能的同步更多的数据,可以在Slave上将master_log_pos节点的值在之前同步失效的值的基础上增⼤⼀些,然后反复测试,直到同步OK。因为MySQL主从复制的原理其实就是从服务器读取主服务器的binlog,然后根据binlog的记录来更新数据库。
2.MySQL-Proxy的rw-splitting.lua脚本在⽹上有很多版本,但是最准确⽆误的版本仍然是源码包中所附带的lib/rw-splitting.lua脚本,如果有lua脚本编程基础的话,可以在这个脚本的基础上再进⾏优化;
3.MySQL-Proxy实际上⾮常不稳定,在⾼并发或有错误连接的情况下,进程很容易⾃动关闭,因此打开--keepalive参数让进程⾃动恢复是个⽐较好的办法,但还是不能从根本上解决问题,因此通常最稳妥的做法是在每个从服务器上安装⼀个MySQL-Proxy供⾃⾝使⽤,虽然⽐较低效但却能保证稳定性;
4.⼀主多从的架构并不是最好的架构,通常⽐较优的做法是通过程序代码和中间件等⽅⾯,来规划,⽐如设置对表数据的⾃增id值差异增长等⽅式来实现两个或多个主服务器,但⼀定要注意保证好这些主服务器数据的完整性,否则效果会⽐多个⼀主多从的架构还要差;
5.MySQL-Cluster 的稳定性也不是太好;
6.Amoeba for MySQL 是⼀款优秀的中间件软件,同样可以实现读写分离,负载均衡等功能,并且稳定性要⼤⼤超过MySQL-Proxy,建议⼤家⽤来替代MySQL-Proxy,甚⾄MySQL-Cluster。
24、简述数据库分库分表?(⽔平、垂直)
答:(1)数据库分表
把⼀张表按照⼀定的规则分解成不同的实体表。⽐如垂直划分和⽔平划分
垂直切分:把不同功能,不同模块的数据分别放到不同的表中,但是如果同⼀个模块的数据量太⼤就会存在性能瓶颈⽔平切分:垂直切分解决不了⼤表的瓶颈,如果同⼀个功能中表的数据量过⼤,就要对该表进⾏切分,为⽔平切分通俗理解:垂直切分---分不同的模块表;⽔平切分---分同⼀个模块下的多个表
(2)分库
将⼀堆数据放到不同的数据库中保存,上⾯说的都是在同⼀个数据库上,分库是分到不同的数据库上

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。