9、怎么验证mysql的索引是否满足需求?

explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好地索引和写出更优化的查询语句。
使用方法,在select语句前加上explain就可以了。

10、说一下数据库的事务隔离?

当多个线程开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性。
脏读:指一个事务处理过程里读取了另一个未提交的事务中的数据。
不可重复读:指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
不可重复读和脏读的区别:脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
幻读:事务非独立执行时发生的一种现象。
数据库事务的隔离级别有4个,由低到高依次为Read uncommitted(读取未提交) 、Read committed(读取提交) 、Repeatable read (可重复读)、Serializable (可串行化),这四个级别可以逐个解决脏读 、不可重复读 、幻读 这几类问题。
1、Read Uncommitted(读取未提交内容)(可能会出现脏读、可重复读、幻读现象。下同)
(1)所有事务都可以看到其他未提交事务的执行结果
(2)本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少
(3)该级别引发的问题是——脏读(Dirty Read):读取到了未提交的数据
2、Read Committed(读取提交内容)(不可重复读,幻读)
(1)这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)
(2)它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变
(3)这种隔离级别出现的问题是——不可重复读(Nonrepeatable Read):不可重复读意味着我们在同一个事务中执行完全相同的select语句时可能看到不一样的结果。
导致这种情况的原因可能有:(1)有一个交叉的事务有新的commit,导致了数据的改变;(2)一个数据库被多个实例操作时,同一事务的其他实例在该实例处理其间可能会有新的commit
3、Repeatable Read(可重读)(幻读)
(1)这是MySQL的默认事务隔离级别
(2)它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行
(3)此级别可能出现的问题——幻读(Phantom Read):当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行
(4)InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题
4、Serializable(可串行化)(不会出现以上三类问题)
(1)这是最高的隔离级别
(2)它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。
(3)在这个级别,可能导致大量的超时现象和锁竞争

11、说一下 mysql 常用的引擎?

mysql的两种常用引擎:

MYSQL 数据库 屏蔽敏感词 mysql怎么避免脏读_数据库


MyISAM

MyIASM引擎,它是MySql的默认引擎,但不提供事务的支持,也不支持行级锁和外键。因此当执行Insert插入和Update更新语句时,即执行写操作的时候需要锁定这个表。所以会导致效率会降低。不过和Innodb不同的是,MyIASM引擎是保存了表的行数,于是当进行Select count() from table语句时,可以直接的读取已经保存的值而不需要进行扫描全表。所以,如果表的读操作远远多于写操作时,并且不需要事务的支持的。可以将MyIASM作为数据库引擎的首先。
MyISAM引擎特点
1、不支持事务(事务是指逻辑上的一组操作,组成这组操作的各个单元,要么全成功,要么全失败)
2、表级锁定(数据更新时锁整个表):其锁定机制是表级锁定,这虽然可以让锁定的实现成本很小但是也同时大大降低了其并发性能。
3、读写互相阻塞:不仅会在写入的时候阻塞读取,MyISAM还会在读取的时候阻塞写入,但读本身并不会阻塞另外的读。
4、只会缓存索引:MyISAM可以通过key_buffer_size缓存索引,以大大提高访问性能减少磁盘io,但是这个缓存区只会缓存索引,而不会缓存数据。
5、读取速度较快,占用资源相对少
6、不支持外键约束,但支持全文索引
7、MyISAM引擎是mysql5.5.5前缺省的存储引擎
MyISAM引擎适用的生产环境
1、不需要事务支持的业务(例如转账就不行,充值付款)
2、一般为读数据比较多的应用,读写都频繁场景不合适,读多或者写少的都合适。
3、读写并发访问相对较低的业务(纯读纯写高并发也可以)(锁定机制问题)
4、数据修改相对较少的业务(阻塞问题)。
5、以读为主的业务,例如:www,blog,图片信息数据库,用户数据库,商品库等业务
6、对数据一致性要求不是非常高的业务。
7、硬件资源比较差的机器可以用MyISAM。
单一对数据库的操作都可以使用MyISAM,所谓单一就是尽量纯读,或纯写(insert,update,delete)等。
8、不适合做主键的引擎,因为写锁后,其他线程不能做任何操作,大量的更新会使查询很难得到锁,从而造成永远阻塞。
9、大批量的插入语句时(这里是INSERT语句)在MyIASM引擎中执行的比较的快。
MyISAM引擎调优
1、设置合适的索引(缓存机制)
2、调整读写优先级,根据实际需求确保重要操作更优先执行。
3、启用延迟插入改善大批量写入性能(降低写入频率,尽可能多条数据一次性写入)
4、尽量顺序操作让insert数据都写入到尾部,减少阻塞。
5、分解大的时间长的操作,降低单个操作的阻塞时间。
6、降低并发数(减少对mysql访问),某些高并发场景通过应用进行排队队列机制Q队列
7、对于相对静态(更改不频繁)的数据库数据,充分利用Query Cache或memcached缓存服务可以极大的提高访问效率。
grep query my.cnf
query_cache_size = 2M
query_cache_limit = 1M
query_cache_min_res_unit = 2k
8、MyISAM的count只有在全表扫描的时候特别高效,带有其他条件的count都需要进行实际的数据访问
select count(
) from oldboy.zizeng;

9、可以把主从同步的主库使用innodb,从库使用myisam引擎(但是在为了主从切换的时候还是要用innodb,所以这个不现实。)

InnoDB

Innodb引擎提供了对数据库ACID事务的支持。并且还提供了行级锁和外键的约束。它的设计的目标就是处理大数据容量的数据库系统。它本身实际上是基于Mysql后台的完整的系统。Mysql运行的时候,Innodb会在内存中建立缓冲池,用于缓冲数据和索引。但是,该引擎是不支持全文搜索的。同时,启动也比较的慢,它是不会保存表的行数的。当进行Select count(*) from table指令的时候,需要进行扫描全表。所以当需要使用数据库的事务时,该引擎就是首选。由于锁的粒度小,写操作是不会锁定全表的。所以在并发度较高的场景下使用会提升效率的。

InnoDB引擎特点

1、支持事务:支持4个事务隔离级别,支持多版本读。

2、行级锁定(更新时一般是锁定当前行):通过索引实现,全表扫描仍然会是表锁,注意间隙锁的影响。

3、读写阻塞与事务隔离级别相关。

4、具有非常高效的缓存特性:能缓存索引,也能缓存数据。

5、整个表和主键以cluster方式存储,组成一颗平衡树。

6、所有secondary index都会保存主键信息。

7、支持分区,表空间,类似oracle数据库。

8、支持外键约束,5.5以前不支持全文索引,以后支持了。

9、和Myisam引擎相比,innodb对硬件资源要求比较高。

innodb引擎适用的生产环境

1、根据事务支持的业务(具有较好的事务特性)

2、行级锁定对高并发有很好的适应能力,但需要确保查询是通过索引完成的。

3、数据读写及更新都较为频繁的场景,如:BBS,SNS,微博,微信等。

4、数据一致性要求较高的业务,例如:充值转账,银行卡转账。

5、硬件设备内存较大,可以利用innodb较好的缓存能力来提高内存利用率,尽可能减少磁盘io。

共享表空间对应物理数据文件

独立表空间对应物理数据文件

6、相比myisam,innodb更消耗资源,速度没有myisam快

7、大容量的数据集时趋向于选择Innodb。因为它支持事务处理和故障的恢复。Innodb可以利用数据日志来进行数据的恢复。主键的查询在Innodb也是比较快的。

8、UPDATE语句在Innodb下执行的会比较的快,尤其是在并发量大的时候。

innodb引擎的调优

1、主键要尽可能小,避免给secondary index带来过大的空间负担。

2、避免全表扫描,因为会使用表锁

3、尽可能缓存所有的索引和数据,提高响应速度,减少磁盘io消耗。

4、在大批量小插入的时候,尽量自己控制事务而不要使用autocommit自动提交,有开关可以控制提交方式。

5、合理设置innodb_flush_log_at_trx_commit参数值,不要过度追求安全性。

如果innodb_flush_log_at_trx_commit的值为0,log buffer 每秒就会被刷写日志文件到磁盘,提交事务的时候不做任何操作。

6、避免主键更新,因为这会带来大量的数据移动。

两种引擎所使用的数据结构:
都是使用的B+TREE;
MyIASM引擎,B+树的数据结构中存储的内容实际上是实际数据的地址值。也就是说它的索引和实际数据是分开的,只不过使用索引指向了实际数据。这种索引的模式被称为非聚集索引。
Innodb引擎的索引的数据结构也是B+树,只不过数据结构中存储的都是实际的数据,这种索引有被称为聚集索引。

12、说一下 mysql 的行锁和表锁?

相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。
MySQL大致可归纳为以下3种锁:
表级锁:偏向myisam存储引擎,开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:偏向innodb存储引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
当选中某一行时,如果通过主键或者索引选中的,这个时候是行级锁;如果是通过其他条件选中的,这个时候行级锁会升级成表级锁,其它事务无法对当前表进行更新或插入操作。

13、说一下乐观锁和悲观锁?

主要用来解决丢失问题。
(1)乐观锁
乐观锁不是数据库自带,需要我们自己去实现。乐观锁是指操作数据库时(更新),认为这次操作不会导致冲突,在操作数据时,并不进行任何其他的特殊处理(也就是不加锁),而在进行更新后,再去判断是否有冲突了。
乐观锁的实现:在表中的数据进行操作时(更新),先给数据表加一个版本(version)字段,每操作一次,将那条记录的版本号加1。也就是先查询出那条记录,获取出version字段,如果要对那条记录进行操作(更新),则先判断此刻version的值是否与刚刚查询出来时的version的值相等,若相等,则说明这段时间,没有其他程序对其进行操作,将version字段的值加1;如果更新时发现此刻的version值与刚刚获取出来的version的值不相等,则说明这段期间已经其他程序对其进行操作了,则不进行更新操作。
(2)悲观锁
悲观锁就是在操作数据时,认为此操作会出现数据冲突,所以在进行每次操作时都要通过获取锁才能进行对相同数据的操作,这点跟Java中synchronized很相似,所以悲观锁需要耗费较多的时间。另外与乐观锁相对应的,悲观锁是由数据库自己实现了的,要用的时候,我们直接调用数据库的相关语句就可以了。
说到这里,由悲观锁涉及到的另外两个锁概念就出来了,它们就是共享锁与排它锁。共享锁和排它锁是悲观锁的不同的实现,它俩都属于悲观锁的范畴。
  乐观锁不能解决脏读,加锁的时间要比悲观锁短(只是在执行sql时加了基本的锁保证隔离性级别),乐观锁可以用较大的锁粒度获得较好的并发访问性能。但是如果第二个用户恰好在第一个用户提交更改之前读取了该对象,那么当他完成了自己的更改进行提交时,数据库就会发现该对象已经变化了,这样,第二个用户不得不重新读取该对象并作出更改。

14、mysql 问题排查都有哪些手段?

Linux服务器重启后发现Mysql无法启动了
(1)启动故障
错误提示:Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’

解决方案:

1:尝试重启mysql服务器,是否出现同样错误

2:如出现同样错误,则删除mysql.sock文件后在重启

rm -rf /usr/local/mysql/mysql.sock

systemclt restart mysqld

(2)启动故障
错误提示:启动mysql时:报错 MySQL Daemon failed to start. 【失败】

解决方案:

1:检查数据目录的权限设置

2:将Mysql的数据目录的属主和属组设置正确,

chown -R mysql:mysql /usr/local/mysql

(3)远程连接故障
错误提示:

使用mysql -u root -h 数据库IP -p 命名远程连接Mysql时候出现提示:

Enter password:

ERROR 2003(HYOOO): Can’t connect to MySQL server on ‘xxx’ (113)

解决方案:

1:排查网络,保证网络正常连接

2:给root帐号进行授权

GRANT all ON . TO ‘root’@‘IP地址’ IDENTIFIED BY ‘123456’ ;

3:关闭防火墙

(4)主从故障
错误提示:在从服务器重启时候出现报错:

Master_SSL_Verify_Server_Cert:No

Last_IO_Errno:1593

Last_IO_Error:fatal error : The slave I/O thread stops because master and slave have equal mysql server ids

解决方案:

将从mysql的service_id 修改为其他值

15、mysql的优化

1、开启查询缓存;
2、EXPLAIN你的SELECT查询
3、当只要一行数据时使用LIMIT1
4、为搜索字段建索引
5、避免 SELECT *
6、.永远为每张表设置一个ID

16、做数据库查询发现特别慢怎么办?

1、建索引;(1、提高查询检索的性能2、创建唯一索引3、创建主键4、归类)
2、减少表之间的关联;
3、优化sql语句,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据量大的表排在前面;
4、简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据。