2020-06-09 11:22:56     分类: Php
摘要: mysql

都是跟PHP面试相关的面试题,再深入就是DBA了,就太苛求了

一、mysql中出现中文乱码如何解决 mysql_query('SET NAMES UTF8')

二、试述Myisam与Innodb之间的区别 1.早期mysql默认采用myisam, 5.7以后默认innodb 2.MyISAM不支持事务,而InnoDB支持。InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交。 3.InnoDB支持数据行锁定,MyISAM不支持行锁定,只支持锁定整个表。即MyISAM同一个表上的读锁和写锁是互斥的,MyISAM并发读写时如果等待队列中既有读请求又有写请求,默认写请求的优先级高,即使读请求先到,所以MyISAM不适合于有大量查询和修改并存的情况,那样查询进程会长时间阻塞。因为MyISAM是锁表,所以某项读操作比较耗时会使其他写进程饿死。 4.Innodb支持外键, MyISAM不支持 5.Inonodb的主键范围更大,是MyISAM的两倍。 6.Innodb不支持全文索引,而MyISAM支持, 7.MyISAM支持GIS数据,InnoDB不支持。即MyISAM支持以下空间数据对象:Point,Line,Polygon,Surface等。 8.没有where的count()使用MyISAM要比InnoDB快得多。因为MyISAM内置了一个计数器,count()时它直接从计数器中读,而InnoDB必须扫描全表。所以在InnoDB上执行count()时一般要伴随where,且where中要包含主键以外的索引列。为什么这里特别强调“主键以外”?因为InnoDB中primary index是和raw data存放在一起的,而secondary index则是单独存放,然后有个指针指向primary key。所以只是count()的话使用secondary index扫描更快,而primary key则主要在扫描索引同时要返回raw data时的作用较大。

三、主键、外键和索引的区别 主键 -- 唯一标识, 不能重复,不能空,用来数据完整性, 一个表只有一个 外键 -- 表的外键是另一表的主键,可重复,可空值,用于关联,用于约束一致性,一个表可以有多个 索引 -- 没有重复值,可以有空值,用于提高排序查询速度,一个表可以有多个

四、char和varchar的区别 char是固定长度,varchar是可变长度

五、什么是存储过程 存储过程是编译好的SQL语句。因为系统在调用SQL语句的时候比较浪费时间,所以预先将一些基本的SQL语句进行预编译,然后再给代码取一个名字,在需要的时候直接调用就可以。 优点是: 1.效率高; 2.降低网络通信; 3.在一定程度上确保数据安全。

六、请阐述索引 索引是对数据库中的一个或多个列值得排序,帮助数据库获取数据的数据结构。 假如我们用类比的方法,数据库中的索引就像书的目录一样,当我们想找到某个知识点,我们可以直接目录中找而不是从书页中找。但是这也是索引的一个缺点,对数据库修改的时候要修改索引导致时间变多。 索引优点: 1.加快检索速度; 2.唯一索引确保每行数据的唯一性; 3.在使用索引的过程可以优化隐藏器,提高系统西鞥能 索引缺点: 1.插入、删除、维护速度下降。

七、清阐述事务 事务是并发控制的基本单位。事务就是一系列的操作,这些操作要么执行,要么不执行。 事务具有以下特性: 1.原子性 - 事务中的操作要么全部完成,要么失败 2.一致性 - 一个成功的事务应该将数据写入到数据库,否则就要回滚到最初的状态。 3.隔离性 - 并发访问和修改的独立 4.持久性 - 事务结束应该将事务的处理结构存储起来 事务的语句 开始事务: BEGIN TRANSCATION 提交事务:COMMIT TRANSCATION 回滚事务:ROLLBACK TRANSCATION

八、Mysql有几种事务提交方式 3种 1.自动提交 SET AUTOCOMMIT=1; 不做修改,默认就是这个 用户发出每条SQL语句,mysql都会自动开始一个事务,并且在执行后自动进行提交操作来完成这个事务。也就是说一个SQL语句就是一个事务。

2.显式提交 以BEGIN TRANSCATION命令开始一个事务。

3.隐式提交 SET AUTOCOMMIT=0; 任何DML语句都会开始一个事务,直到你使用commit或者rollback才会结束

九、如何保存事务的快照 save point transcation_point_name;

十、数据库事务并发控制中会遇到哪些问题 1.数据丢失 多个用户同时对数据库进行更改操作,有可能会发生更改丢失,其原因是一个用户的更改被另一个用户覆盖了。

2.未提交的数据读取(错读) 一个用户读取另一用户未提交的数据修改结果,导致错误产生,这个情况又叫脏数据。

3.不一致的读(不可重复读) 查询期间,用户受到干扰,两个相同的查询返回不同的结果,就出现了不一致的数据读取。

4.幻影读(假读) 当对某行执行插入或删除操作,而该行属于某个事务正在读取的行的范围内,被称为幻影读或假读。

十一、数据库事务隔离级别 1.READ UNCOMMITTED 未提交的读取 限制最少,允许读取已被其他用户读取但未提交确定的数据。 优点是: 在此环境下锁处理的语句可便面并发控制所增加的开销,一般用于产生类似信息的事务中。 缺点是: 数据丢失、错读、不可重复读、幻影读都可能会碰到

2.READ COMMITTED 提交读取 比READ UNCOMMITTED更高一层,通过隐藏未提交的变化解决了读脏数据的并发事务问题, 但无法解决不可重复读和幻影读的问题。

3.REPEATABLE READ 可重复读 隔离界别在READ COMMITTED之上,在此隔离级别下,用SELECT命令读取的数据在整个命令执行过程红由DBMS锁定, 不会被更改。 会想用系统的性能

4.SERIALIZABLE 可串行化 最大限制级别,指的是将事务以一种顺序方式连接起来,可以防止一个事务影响其他事务。严重影响系统的性能

十二、如何查看Mysql系统默认事务隔离级别 select @@global.tx_isolation;

十三、如何查看MYsql当前回话的事务隔离级别 select @tx_isocation

十四、如何设置更改Mysql系统默认事务隔离级别 SET global transcation isolation level readcommitted

十五、如何设置更改Mysql当前回话的事务隔离级别 SET session transction isolation level readcommitted

十六、按对数据库的操作类型划分,MYSQL事务锁有几种 1.读锁 又叫共享锁 共享锁锁定的资源可以被其他用户读取,但不能修改,在select命令执行时,数据库通常会对对象进行共享锁锁定,一般情况下,加共享锁的数据也被读取完毕后,共享锁就会立即被释放。

2.写锁 又叫排它锁、独占锁 独占锁锁定的资源只允许进行锁定操作的程序使用,对它任何其它操作均不会被接受,执行数据更新命令时,即INSEET、UPDATE、DELETE时,数据库会自动使用写锁。但当对象上有其它锁存在时,无法对其加写锁,直到更新操作结束,写锁才能被释放。

此外MYSQL没有SQL SERVER那种更新锁

十八、MYSQL事务锁可以操作的对象有哪些 1.表级锁 MyISAM默认提供的就是表级锁,表锁由两种:表共享锁、表独占锁 表级锁的特性: 1.对表的读操作不会阻塞其它用户对同一表的读操作,但是会阻塞对同一表的写操作; 2.对表的写操作,会阻塞其它用户对同一表的所有读与写的操作。 3.表的读操作和写操作,以及写操作之间是串行的,当一个线程获得对一个表的写锁后,只有持有锁的线程才可以对表进行更新操作,其它线程读、写都会等待,直到锁被释放为止。

2.行级锁 行级锁不是mysql自身实现的,是由mysql其它引擎实现的,例如InnoDB以及NDBCluster. 行级锁同样分为两种: 共享锁,排它锁。 Innodb为了让行级锁和表级锁共存,Innodb也同事使用了意向锁的概念(表级锁), 也就有了意向共享锁和意向排它锁两种。

共享锁(s) 排它锁(x) 意向共享锁(IS) 意向排它锁(IX) 共享锁(S) 兼容 冲突 兼容 冲突 排它锁(X) 冲突 冲突 冲突 冲突 意向共享锁(IS) 兼容 冲突 兼容 兼容 意向排它锁(IX) 冲突 冲突 兼容
兼容 如果一个事务的锁模式与当前的锁模式兼容,Innodb就将请求的锁授予该事务。如果两种锁冲突,该事务就要等待锁释放。 意向锁是Innodb自动加的,不需要用户干预, 对于INSERT、UPDATE以及DELETE,Innodb会自动给涉及数据加排它锁。 对于普通SELECT语句,Innodb不会加任何锁,事务可以通过以下语句给记录集加共享锁或排它锁: 共享锁: select from table where .... LOCK IN SHARE MODE 排它锁: select from table where .... FOR UPDATE 用SELECT ... IN SHARE MODE获得共享锁,主要用在需要数据依存关系时来确认某行记录是否存在,并确保没有人对这个记录进行UPDATE或者DELETE操作。 但是如果当前事务也需要对该记录进行更新操作,则很有可能造成死锁,对于锁定行记录后需要进行更新操作的应用,应该使用SELECT... FOR UPDATE方式获得排他锁。

十九、如何加表锁 MyISAM在执行查询语句(SELECT)前,会自动给所有涉及的表加表锁,在执行更新操作前(INSERT UPDATE DELETE)前,会自动给涉及的表加写锁,这个过程并不需要用户干预。因此用户一般不需要直接用LOCK TABLE命令给MyISAM显式的加表锁。 LOCK TABLES table_name WRITE UNLOCK TABLES;

二十、如何优化表锁 1.查询表级锁争用情况 mysql> show status like 'table%'; +----------------------------+---------+ | Variable_name | Value | +----------------------------+---------+ | Table_locks_immediate | 100 | | Table_locks_waited | 11 | +----------------------------+---------+

Table_locks_immediate : 产生表级锁定的次数 Table_locks_waited : 出现表级锁定征用而等待的次数 可以根据这两个参数来分析为什么有较多的锁定资源争用。

2.缩短锁定时间 让Query的时间尽可能的缩短: a.尽量减少大而复杂的query,可以拆分成多个小query分部进行; b.尽量建立足够高效的索引,让数据检索更迅速 c.尽量让MyISAM存储引擎表值存放必要的信息,控制字段类型 d.利用合适的机会优化MyISAM表数据文件

3.分离能并行的操作 打开concurrent_insert,值可以是0|1|2 concurrent_insert=2 无论MyISAM表中有没有空洞,都允许在表尾并行插入记录; concurrent_insert=1 如果MyISAM表中没有空洞,MyISAM允许一个进程在读表的同时,另一个进程从表尾插入记录。 这也是mysql默认设置。 concurrent_insert=0 不允许从表尾插入 可以利用MyISAM存储引擎的并发插入特性,来解决应用中对同一表查询和插入的锁争用。例如,将concurrent_insert系统变量设为2,总是允许并发插入;同时,通过定期在系统空闲时段执行OPTIMIZE TABLE语句来整理空间碎片,收回因删除记录而产生的中间空洞。

4.合理利用读写优先级 通过执行命令SET LOW_PRIORITY_UPDATES=1,使该连接读比写的优先级高。如果我们的系统是一个以读为主,可以设置此参数,如果以写为主,则不用设置; 通过指定INSERT、UPDATE、DELETE语句的LOW_PRIORITY属性,降低该语句的优先级。 MySQL也提供了一种折中的办法来调节读写冲突,即给系统参数max_write_lock_count设置一个合适的值,当一个表的读锁达到这个值后,MySQL就暂时将写请求的优先级降低,给读进程一定获得锁的机会。

二十一、如何给InnoDB加行锁 InnoDB行锁是通过给索引上的索引项加锁实现的,只有通过索引检索数据,InnoDB才使用行级锁,否则,InnoDB使用表锁。 1.在不通过索引条件查询时,使用的是表锁,不是行锁; 2.访问不同行的激励,但是是相同的索引键,会出现锁冲突; 3.当表有多个索引的时候,不同事务可以使用不同的索引来锁定不同的行。另外,无论是使用主键索引、唯一索引或普通索引,InnoDB都会使用行锁对数据加锁。 4.即便在条件中使用了索引字段,但是否使用索引来检索数据是由MySQL通过判断不同执行计划的代价来决定的,如果MySQL认为全表扫描效率更高,比如对一些很小的表,它就不会使用索引,这种情况下InnoDB将使用表锁,而不是行锁。因此,在分析锁冲突时,别忘了检查SQL的执行计划,以确认是否真正使用了索引

二十二、请说明行级锁的优缺点 优点: 1.当在许多线程中访问不同的行时只存在少量锁定冲突 2.回滚时只要少量的更改 3.可以长时间锁定单一的行 缺点: 1.比表级锁占用更多的内存 2.当在表的大部分中使用时,比表级锁定慢,因为你必须获取更多的锁; 3.如果你在大部分数据上经常进行GROUP BY操作或者必须经常扫描整个表,比表级锁明显慢的多; 4.用高级别锁定,通过支持不同的类型锁定,你也可以很容易的调节应用程序,因为其成本小于行级锁定。

二十三、在哪些条件下表级锁优于行级锁 1.表的大部分数据用于读取 2.对严格的关键字进行读取或更新,你可以更新或删除可以用单一的读取的关键字来提取的一行; 3.UPDATE table_name SET column=value WHERE unique_key_col=key_value; 4.DELETE FROM table_name WHERE unique_key_col=key_value;; 5.SELECT结合并行的INSERT语句,并且只有很少的UPDATE和DELETE语句; 6.在整个表上有很多扫描及GROUP_BY查询,没有任何写操作;

二十四、表级锁和行级别锁对比有什么区别 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 仅从锁的角度来说,表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如WEB应用;行级锁更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统。

二十五、什么是乐观锁、什么是悲观锁 乐观锁和悲观锁是从程序员角度看的 乐观锁 : 指在处理数据时,不需要在应用程序的代码中做任何事情,就可以直接在记录上加锁,即完全靠数据库来管理所的工作。 悲观锁: 不采用数据库的自动管理,需要程序员直接管理数据或对象上的枷锁处理,并负责获取或放弃正在使用的数据上的任何锁。

二十六、什么是死锁 死锁是在多用户或多进程状况下,为使用同一资源而产生的无法解决的争用状态。 通俗的讲,就是两个用户各占用一个资源,两人都想使用对方的资源,但同时又不愿放弃自己的资源,就一直等待对方放弃资源,如果不进行干涉,就会一直持续下去。

二十七、如何预防数据库死锁 1.尽量避免并发地执行涉及到修改数据的语句; 2.要求每个事务一次就将所有要使用的数据全部加锁,否则就不予执行; 3.预先规定一个封锁顺序,所有的事务都必须按这个顺序对数据执行封锁,如不同的过程在事务内部对对象的更新执行顺讯赢尽量保持一致 4.每个事务的时间不可太长,对程序段长的事务可以考虑将其分隔为几个事务;

二十八、delete、drop、truncate的区别 1.delete和truncate只删除表的数据不删除表的结构,drop删除结构和数据 2.速度drop>truncate>delete 3.删除部分数据时,使用delete带where条件 4.保留表结构删除所有数据时用truncate

二十九、请表述数据库的三大范式 第一范式 : 字段具有原子性,不可再分 第二范式 : 表中没列都和主键有关 第三范式 : 每列都和主键直接相关,而不是间接相关

三十、SQL语句应考虑哪些安全性 1.防止SQL注入,对特殊字符串进行转义,过滤或使用预编译的SQL语句绑定变量; 2.最小权限原则,特别是不要用root账户,为不同类型的动作或组使用不同的账户; 3.当SQL运行出错时,不要把数据库返回的错误信息全部显示给用户,以防泄漏服务器和数据库相关的信息。

三十一、一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15? 1.如果表的类型是MyISAM,那么是18。 因为MyISAM表会把自增主键的最大ID记录到数据文件里,重启MySQL自增主键的最大ID也不会丢失。 2.如果表的类型是InnoDB,那么是15。 InnoDB表只是把自增主键的最大ID记录到内存中,所以重启数据库或者是对表进行OPTIMIZE操作,都会导致最大ID丢失。

三十二、简单描述mysql中,索引,主键索引,唯一索引,联合索引的区别,对数据库的性能有什么影响。 1.索引是一种特殊文件(InnoDB数据表上的索引是表空间的一个组成部分),他们包含对数据表里所有记录的引用指针; 2.普通索引(由关键字KEY和INDEX定义的索引)的唯一任务是加快对数据库的访问; 3.普通索引允许被索引的数据列包含重复的值,如果能确定某个数据列包含彼此各部相同的值,在为这个数据列创建索引的时候就应该用关键字unique把它定义为一个唯一索引,唯一索引可以保证数据记录的唯一性。 4.主键 索引是一种特殊的唯一索引,在一张表中只可以定义唯一一个主键索引, 主键用于唯一标识的一条记录。用关键字PRIMARY KEY来创建。 5.索引可以覆盖多个数据列,如INDEX索引,就是联合索引 6.索引可以极高地提高数据查询的速度,但会降低插入更新删除表的速度,因为在执行这些写操作时,还要操作索引文件。

三十三、什么是MYSQL查询缓存 MYSQL自5.1.17开始缓存SELECT操作或预处理查询的结果集和SQL语句,新的SEELCT语句或预处理查询语句,先去查询缓存,判断是否存在可用的记录集。判断与缓存的SQL语句是否一样,区分大小写。 以下查询语句无法缓存: 1.查询语句中加了SQL_NO_CACHE参数; 2.查询语句中含有获得值得参数,包含自定义函数, 如:CURDATE(), GET_LOCK(), RAND(), CONVERT_TZ()等 3.对系统数据库的查询:mysql、infomation_schema查询语句中使用SESSION级变量或存储过程中的局部变量。 4.查询语句中使用了LOCK, IN SHARE MODE, FOR UPDATE的语句,查询语句中类似SELECT...INTO的导出语句 5.对临时表的查询操作,存在警告信息的查询语句;不设计任何表或视图的查询语句;某用户只有列级别的查询语句; 6.事务隔离级别serializable的情况下,所有查询缓存都不可用;

三十四、如何配置Mysql查询缓存 可以通过两个参数query_cache_type和query_cache_size两个参数,其中任何一个参数为0 即为关闭查询缓存 1.0(OFF) 关闭query cache缓存, 任何情况下都不会使用query cache缓存 2.1(ON) 启用查询缓存,只要符合查询缓存的需求,客户端查询语句和记录集都可以缓存起来,其它客户端可以使用。 3.2(DEMAND) 启用查询缓存,只要查询语句中添加了查询参数sql_cache,切符合查询缓存的需求,查询语句和记录集,则可以缓存起来,其它客户端可以使用。 query_cache_size语序设置最小为4k, 对于最大值几乎可以认为无限制,实际生产环境应用经验告诉我们,该值并不是越大。查询缓存命中率就越高,也不是对服务器负载贡献越大,反而可能抵消其带来的好处,设置增加服务器的负载,推荐设置64M,最大不超过256M。

三十五、查询缓存有哪些缓存项 可以使用以下命令查看缓存项 show global status like 'QCache%'; qcache_free_blocks - 目前还处于空闲状态的query cache 中的内存blocks数目; qcache_free_memory - 目前还处于空闲状态的query cache内存总量; qcache_hits - query cache 命中率; qcache_inserts - 向query cache中插入query cache次数,也就是没有命中的次数; qcache_lowmem_prunes - 当query cache内存量不够,需要从中删除老的query cache以给新cache对象使用的次数; qcache_not_cached - 没有cache的sql数。包括无法被cache的sql以及query_cache_type设置为不会被cache的sql; qcache_queries_in_cache - 目前query cache中的sql数量 qcache_total_blocks - query cache 中block数量

query cache系统变量查看: show variables like '%query_cache%' has_query_cache - 是否支持query cache query_cache_limit - 存放单挑query的最大结果集,默认为1M,结果集超过该大小则不缓存 query_cache_min_res_unit - 每个结果集存放的最小内存大小,默认4k query_cache_size - 表示系统中用于query cache的大小 query_cache_type - 系统是否打开了query cache query_cache_wlock_invalidate - 针对myisam存储引擎,设置当有write lock在某个table上面的时候,读请求是要等待write lock释放资源之后再查询还是允许直接从query cache中读取结果,默认是OFF,可以直接从query cache中取得结果。

三十六、查询缓存中内存碎片是如何产生的 当一块分配的内存没有完全使用时,mysql就会将这块内存trim掉,把没有使用的那部分归还以便重复利用。比如,第一次分配4KB,只用了3KB,剩1KB,第二次连续操作,分配4KB,用了2KB,剩2KB,这两次连续操作共剩下的 1KB+2KB=3KB,不足以做个一个内存单元分配, 这时候,内存碎片便产生了。使用flush query cache,可以消除碎片

三十七、Mysql如何计算查询缓存的命中率和内存使用率 1.query_cache_min_res_unit 内存使用率 约等于 (query_cache_size - Qcache_free_memory) / Qcache_queries_in_cache 约等于 (系统qcache大小-qcache剩余内存大小)/cache的sql数量

2.查询命令率 约等于 (Qcache_hits – Qcache_inserts) / Qcache_hits 100% 约等于(命中率-未命中率)/命中率100%

3.查询缓存内存使用率 约等于(query_cache_size – Qcache_free_memory) / query_cache_size 100% 约等于(系统qcache大小-qcache剩余内存大小)/系统qcache大小100%

三十八、Mysql查询缓存有哪些优缺点 优点: 1.对于一些频繁的的查询及预编译语句,使用查询缓存,可以直接从缓存中返回查询结果,而不用再从表中区出,减少IO开销;

缺点: 1.query语句的hash计算和hash查找带来资源消耗,mysql会对每条接收到的select类型的query进行hash计算,然后查找该query的cache是否存在,虽然hash计算和查找的效率已经足够高了,一条query带来的消耗可以忽略,虽然一旦涉及到高并发,成千上万条query时,hash计算和查找所带来的资源开销就值得重视了。

2.query cache失效的问题,如果表变更比较频繁,则会造成query cache失效率很高,表变更不仅仅指表中的数据发生变化,还包括结构或索引的任何变化。

3.对于不同的sql但同一结果集的query都会被缓存,这样就会造成内存资源的过渡消耗,SQL的字符大小写、空格或注释的不同,缓存都认识是不同的sql,因为hash不同.

4.相关参数不合理会造成大量内存碎片。

三十九、如何提高MYSQL缓存命中率 1.配置时,客户端与服务器端使用相同的字符集 2.在客户端,固化要查询的语句 3.提高内存中缓存的配置,来提高缓存命中率 4.通过分区表可以提高缓存的命中率;

四十、MYSQL有几种日志 mysql5.5以上有5种日志: 1.错误日志 - log-err 2.查询日志 - log 3.慢查询日志 - -log-slow-queries 4.二进制日志 - log-bin 5.中继日志 - relay log innodb还有redo 在线日志 可以使用 show variables like "log_%" 来看看日志开启状态

四十一、请表述MYSQL错误日志 错误日志记录着mysqld启动和停止,以及服务器再运行的过程中发生的错误的相关信息,默认情况下,系统的错误日志是关闭的,错误信息被输出到标准错误输出,需要在启动的时候开启log-error选项。 如果没有指定文件名,默认是hostname.err, 默认存放在datadrr目录。 指定错误目录有两种方法 编辑my.cnf 写入 log-error=[path] 通过命令参数错误日志 mysqld_safe --user=mysql --log-error=[path] &

四十二、如何查看MYSQL错误日志 show variables like '%err%'; +--------------------+--------------------------+ | Variable_name | Value | +--------------------+--------------------------+ | error_count | 0 | | log_error | /var/log/mysql/mysql.log | | max_connect_errors | 10 | | max_error_count | 64 | | slave_skip_errors | OFF | +--------------------+--------------------------+ 5 rows in set (0.00 sec)

四十三、请描述MYSQL查询日志 查询日志记录了服务器接收到的每一条查询或是命令,无论这些查询是否正确设置是包含语法错误,查询日志都会将其记录下来。记录的格式为 {Time ,Id ,Command,Argument }。 由于MYSQL服务器需要不断的记录日志,开启查询日志会产生不小的系统开销,因此默认是关闭的。查询日志是在客户端自行命令,并且释放锁之前,写入日志的。

查询日志支持写入到文件或数据库,可以在global中修改。 记录到CSV表中: set global log_output='table' 记录到文件中: set global log_output=file; 开启查询日志: set global general_log=on; 关闭查询日志: set global general_log=off; 关闭session记录sql日志: set global sql_log_off=on; 清理日志: mysqladmin -uroot -pmysql flush-logs

四十四、请描述慢查询日志 -log-show-queries 慢查询日志采用简单的文本格式,可以通过文本编辑器查询其中的内容,其中记录了语句的执行时刻、执行消耗时间,执行用户,连接主机信息等。 慢查询只有在大于log_query_time指定时间的sql statement, min_examined_limit最小检查行数才会被检查,语句写入slowlog是在越剧被执行之后,并且释放锁之前,默认情况下慢查询日志是被关闭的。

long_query_time : 0-10之间,默认是10 log_show_admin_statements : 系统管理语句,默认ALTER TABLE, ANALYZE TABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE, and REPAIR TABLE.log_queries_not_using_indexes。默认情况下,管理语句和不适用的语句是不会记录在慢查询中,需要人工设置。 log_short_format: 记录少量的日志 log_throttle_queries_not_using_indexes:用来表示每分钟允许记录到slow log的且未适用SQL索引的SQL语句次数,该值默认为0,表示没限制,在生产环境下,若没适用索引,此类语句会被频繁的记录到slow log, 导致slow log不断增加。

查看慢查询配置 show variables like '%slow%'

启用: 1.在my.cnf里 log-slow-queries = [file name] 2.在mysqld进程启动时 --log-show-queries = [file name]

四十五、Mysql慢查询分析工具都有哪些 mysqldumpslow, mysqlsla, myprofi, mysql-explain-slow-log, mysqllogfilter

mysqldumpslow mysql官方提供的慢查询日志分析工具 mysqldumpslow [-s] [-t] [-g] dir/slow.log -s : 表示按照何种方式排序,c、t、l、r分别是按照记录次数、时间、查询时间、返回的记录数来排序,ac、at、al、ar表示相应的倒叙。 -t : 是top n的意思,即返回前面多少条的数据 -g : 后面可以写一个正则匹配模式,大小写不敏感。

查询出来的数据: Count : 查询语句出现的次数 Time: 查询语句执行的最长时间 括号内是累计耗费时间 Lock : 查询语句等待锁的时间 Rows : 发送给客户端的行总数,括号内是扫描的行总数 后面是用户以及查询语句本身

四十六、Mysql binlog是什么 binlog即为mysql 二进制日志 binlog日志用于记录所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的DELETE)的所有语句。语句以事件的形式表现,它描述数据的更改。因为有了数据更新的binlog, 所以可以用于实时备份,与master/slave复制。 mysql> set sql_log_bin=1/0; //如果用户有super权限,可以启用或禁用当前会话的binlog记录 mysql> show master logs; //查看master的binlog日志 mysql> show binary logs; //查看master的binlog日志 mysql> show master status; //用于提供master二进制日志文件的状态信息 mysql> show slave hosts; //显示当前注册的slave的列表。不以--report-host=slave_name选项为开头的

四十七、什么是中继日志 中继日志也是二进制日志,用于给slave库恢复使用

四十七、Mysql binlog有几种类型,有什么区别 有3中,通过binlog_format来设置 1.STATEMENT- 二进制文件记录的是逻辑失SQL语句 2.ROW - 在此格式下,二进制记录的不再是简单的SQL语句了,而是记录表的行更改情况。以此可以将InnoDB的事务隔离设为READ COMMITTED,以获得更好的并发性。 3.MIXED - 在此格式下,mysql默认采用STATEMENT格式进行二进制日志文件的记录,但在一些情况下回使用ROW格式,可能的情况包括: a.表的存储引擎为NDB,这时对于表的DML操作都会以ROW格式记录 b.使用了UUID()、USER()、CURRENT_USER()、FOUND_ROWS()、ROW_COUNT()等不确定函数 c.使用了INSERT DELAY语句 e.使用了用户定义函数 f.使用了临时表

四十八、Mysql唯一索引的关键字是 A.fulltext index B.only index C.unique index D.index 答案C

四十九、下面关于索引描述错误的一项是 A.索引可以提高数据查询的数据 B.索引可以降低数据的插入速度 C.Innodb存储引擎支持全文索引 D.删除索引的命令时Drop index 答案是C,只有MyISAM有全文索引

五十、支持主外键、索引及事务的存储引擎为 A.MyISAM B.InnoDB C.MEMORY D.CHARACTER 答案是B

五十一、对事务中描述不正确的是 A.事务具有原子性 B.事务具有隔离性 C.事务回滚使用COMMIT命令 D.事务具有可靠性 答案是C 应该是ROLLBACK

五十二、MYSQL中备份数据库的命令是 A.mysqldump B.mysql C.backup D.copy 答案是A

五十三、实现批量数据导入的命令时 A.mysqldump B.mysql C.backup D.return 答案是A

五十四、创建用户的命令是 A.join user B.create user C.create root D.mysql user 答案是D

五十五、修改自己mysql服务器的密码是 A.mysql B.grant C.set password D.change password 答案是C

五十六、联合查询使用的关键字是 A.UNION B.JOIN C.ALL D.FULL 答案是B

五十七、有订单表orders,包含用户信息userid, 产品信息 productid, 以下哪条语句能够返回至少被订购过两回的productid A. select productid from orders where count(productid)>1 B. select productid from orders where max(productid)>1 C. select productid from orders where having count(productid)>1 group by productid D. select productid from orders group by productid having count(productid)>1 答案是C

五十八、子查询中可以使用运算符ANY,它的意思是 A.满足所有条件 B.至少满足一个条件 C.一个都不用满足 D.满足多个条件 答案是B

五十九、事务中能实现回滚的命令的是 1.TRANSCATION B.COMMIT C.ROLLBACK D.SAVEPOINT
答案是C

六十、mysql中的约束不包括 A.检查约束 B.默认约束 C.非空约束 D.唯一约束

六十一、请说出视图的作用,视图可以更改吗? 视图是虚拟的表,于包含数据的表不一样,视图只包含使用时动态检索数据的查询,不包含任何的列或数据。使用视图可以简化复杂SQL操作,隐藏具体的细节,保护数据;视图创建后,可以使用预表相同的方式创建他们。 某些未使用联合子查询分组聚合函数的视图是可以更新的,但最好不要。

六十二、如何优化MYSQL性能 可以从如下几个方面: 1.从软件和编程层面进行优化 a.合适的字段类型和合适的字段长度 b.少用子查询,可以用join代替 c.使用合理的事务隔离机制和锁机制 d.正确地使用索引 e.避免使用select * f.字段尽可能的设置为NOT NULL

2.硬件优化 a.增加物理内存 b.增加应用缓存 c.用固态硬盘方案

3.架构优化 a.分库 b.分表 3.读写分离

4.慢查询分析 5.使用云数据库

六十三、Mysql分表的时机是什么 一张表的数据,达到百万级千万级的时候, 慢查询日志较多的时候

六十四、Mysql有哪些分表方式 1.mysql集群 mysql集群是另一种意义上的分表 2.水平分表 - 同一表的内容认为划分到多表,根据数据的活跃度分离。冷数据使用MYISAM,活跃数据用INNODB。 特殊数据可以用memcached 以及redis 3.垂直分表 - 表结构一样,划分成多个表,按一定规则划分。


文章标签: