面试题首页 > MySQL面试题

MySQL其它面试题

001什么是当前读和快照读吗?

简单来说在高并发情况下当前读是获取最新的记录并且其他事务不能修改这个记录、快照读获取的有可能是老的数据。当前读是加了锁的,并且加的是悲观锁。而快照读是没加锁的。

002什么是MVCC?

MVCC,全称Multi-Version Concurrency Control,即多版本并发控制,是一种高并发版本控制器,一般用于数据库中对数据的并发访问。Mysql中的innoDB中就是使用这种方法来提高读写事务的并发性能。因为MVCC是一种不采用锁来控制事务的方式,是一种非堵塞、同时还可以解决脏读,不可重复读,幻读等事务隔离问题,但不能解决更新丢失问题。
总之:就是MVCC是通过保存数据的历史版本,根据比较版本号来处理数据是否显示,从而达到读取数据的时候不需要加锁就可以保证事务隔离性的效果。

003MVCC 实现的原理?

MVCC的实现原理是依靠记录中的3个隐含字段、undo log日志(回滚日志 )、Read View来实现的。
1:隐含字段:
    DB_TRX_ID:记录操作该数据事务的事务id;
    DB_ROLL_PTR:指向上一个版本数据在undo log里的位置指针
    DB_ROW_ID:隐藏ID,当创建表没有合适的索引作为聚集索引时,会用该隐藏ID创建聚集索引
2:undo log日志:
insert undo log:在进行插入操作事务时产生、在事务回滚时需要、在提交事务后可以被立即丢掉
update undo log:进行update、delete时产生的undo log、不仅在回滚事务时需要、在快照读时也需要。所以不能随便删除,只有在快照读或事务回滚不涉及该日志时,对应的日志才会被purge线程统一清除(purge类似jvm中的gc垃圾回收器)
3:Read View(读视图)
Read View读视图就是用来记录发生快照读那一刻所有的记录,当你下次就算有执行新的事务记录改变了,read view没变,读出来的数据依然是不变的。
而隔离级别中的RR(可重复读)、和RC(提交读)不同就是差在快照读时。前者创建一个快照和Read View,并且下次快照读时使用的还是同一个Read View,所以其他事务修改数据对他是不可见的、解决了不可重复读问题。后者则是每次快照读时都会产生新的快照和Read View所以就会产生不可重复读问题。

004MySQL中都有哪些触发器?

MySQL 数据库中有六种触发器:
● Before Insert、After Insert
● Before Update、After Update
● Before Delete、After Delete

005什么是MySQL数据库缓存?

开启Mysql的查询缓存,当执行完全相同的SQL语句的时候,服务器就会直接从缓存中读取结果,当数据被修改,之前的缓存会失效,修改比较频繁的表不适合做查询缓存。

006如何查询缓存相关的配置?

1. 查看当前的MySQL数据库是否支持查询缓存:
SHOW VARIABLES LIKE 'have_query_cache';
2. 查看当前MySQL是否开启了查询缓存 :
SHOW VARIABLES LIKE 'query_cache_type';
3. 查看查询缓存的占用大小 :
SHOW VARIABLES LIKE 'query_cache_size';
4. 查看查询缓存的状态变量:
SHOW STATUS LIKE 'Qcache%';

007缓存数据失效时机?

1) SQL 语句不一致的情况, 要想命中查询缓存,查询的SQL语句必须完全一致。

select count(*) from tb_item; SQL2 : Select count(*) from tb_item;

2) 当查询语句中有一些不确定的时,则不会缓存。如 : now() , current_date() , curdate() , curtime() , rand() ,uuid() , user() , database() 。

select * from tb_item where updatetime < now() limit 1; 
select user(); 
select database();

3) 不使用任何表查询语句。

select 'A';

4) 查询 mysql, information_schema或 performance_schema 数据库中的表时,不会走查询缓存。

select * from information_schema.engines;

5) 在存储的函数,触发器或事件的主体内执行的查询。
6) 如果表更改,则使用该表的所有高速缓存查询都将变为无效并从高速缓存中删除。这包括使用 MERGE 映射到已更改表的表的查询。一个表可以被许多类型的语句,如被改变 INSERT, UPDATE, DELETE,TRUNCATE TABLE, ALTER TABLE, DROP TABLE,或 DROP DATABASE 。

008MySQL数据类型优化?

● 尽量用小范围的数据类型:一般情况下,应该尽量使用可以正确存储数据的最小范围数据类型。 
● 尽量用整型:简单的数据类型通常需要更少的CPU周期。例如,整数比字符操作代价更低,因为字符集和校对规则(排序规则)使字符比较比整型比较复杂。 
● 尽量避免NULL:通常情况下最好指定列为NOT NULL 。

009实践中如何优化MySQL?

最好是按照以下顺序优化:
1.SQL语句及索引的优化
2. 数据库表结构的优化
3.系统配置的优化
4.硬件的优化

目录

返回顶部