mysql面试知识点总结

讨论 · 本文由 · ITer · 发布于 1月前 · 103 阅读

索引

1.MyISAM和InnoDB存储引擎:只支持BTREE索引,也就是说默认使用BTREE

2.使用原则 - a、对经常更新的表就避免对其进行过多的索引,对经常用于查询的字段应该创建索引, - b、数据量小的表最好不要使用索引,因为由于数据较少,可能查询全部数据花费的时间比遍历索引的时间还要短,索引就可能不会产生优化效果。 - c、在一同值少的列上(字段上)不要建立索引,比如在学生表的"性别"字段上只有男,女两个不同值。相反的,在一个字段上不同值较多可以建立索引。 3.左模糊查询不能使用索引,比如 select * fromdoc where title like '%XX' 右模糊查询可以使用索引

InnoDB和MyISAM的区别

  • a.InnoDB 支持事务、行级锁, 而MyISAM都不支持
  • b.大量查询用MyISAM,经常更新用InnoDB
  • c.myisam支持 FULLTEXT类型的全文索引;innodb不支持FULLTEXT类型的全文索引
  • d.myisam的索引以表名+.MYI文件分别保存;innodb的索引和数据一起保存在表空间里

"死锁"举例:

表Test:(ID,STATE,TIME) 主键索引:ID 非主键索引:STATE 当执行"UPDATE STATE =1011 WHERE STATE=1000" 语句的时候会锁定STATE索引,由于STATE 是非主键索引,所以Mysql还会去请求锁定ID索引 当另一个SQL语句与语句1几乎同时执行时:“UPDATE STATE=1010 WHERE ID=1” 对于语句2 Mysql会先锁定ID索引,由于语句2操作了STATE字段,所以Mysql还会请求锁定STATE索引。这时。彼此锁定着对方需要的索引,又都在等待对方释放锁定。所以出现了"死锁"的情况。

共享锁(S锁):又称为读锁,可以查看但无法修改和删除的一种数据锁。如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排它锁。获准共享锁的事务只能读数据,不能修改数据。 共享锁下其它用户可以并发读取,查询数据。但不能修改,增加,删除数据。资源共享.

排它锁(X锁):又称为写锁、独占锁,若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A

互斥锁:在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。

悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

乐观锁:顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量.

mysql优化

  • 1.读写分离,分库分表
  • 2.合理的建表,业务分割清楚,合理服务边界划分
  • 3.通过mysql慢查询日志,分析优化sql语句,通过explain分析sql语句
  • 4.建立合理有效的索引

数据库事务中的四大特性 ACID

A:原子性(Atomicity) C:一致性(Consistency) I:隔离性(Isolation) D:持久性(Durability)

分布式事务实现会影响性能,增加程序复杂度:最好采用保证数据的最终一致性来间接实现分布式事务。

主键索引(聚簇索引)和非主键索引(二级索引)的区别?

1.主键索引叶子结点存储的是整行的数据,非主键索引叶子结点存储的是该条数据的主键的值

例如ID是主键,k是非主键子段:

如果查询语句是 select * from table where ID = 100,即主键查询的方式,则只需要搜索 ID 这棵 B+树。 如果查询语句是 select * from table where k = 1,即非主键的查询方式,则先搜索k索引树,得到ID=100,再到ID索引树搜索一次,这个过程也被称为回表。

在哪些情况会导致索引无效

  • 1.sql语句中字段左边做了运算则索引不会生效:select * from t where c - 1 = 1000;
  • 2.sql语句中对字段使用了函数则索引不会生效:select * from t where pow(c,2) = 1000;
  • 3.sql语句中左模糊查询索引不会生效(... like '%aa');右模糊查询索引生效

1、脏读:一个事务可以读取另一个未提交事务的数据。需要注意的是这里针对的是数据本身,可以理解为针对单笔数据。

个人理解:事务A开启进行了查询数据,同时事务B开启,修改了其中一笔数据,但并未提交,这时事务A又进行了查询,这时就有两笔不一样的数据,然后事务B并没有结束,事务B进行了事务回滚,这样事务A就读取了事务B修改后未提交的数据。因为这里出现这种根本原因是未对数据进行提交,就进行了读取。 需进行读提交(Read Committed)就能解决。

2、不可重复读:一个事务进行读取,分别读取到了不同的数据。需要注意的是这里针对的是数据本身,可以理解为针对单笔数据,重点是对数据的修改和删除,所以对行加锁就可以解决。

个人理解:事务A对数据进行查询,这时事物B开启,对其中一笔数据进行了修改,然后进行了提交(这里进行了提交),然后事务A又对数据进行了查询,发现同一笔不同了,所以事务A读取了两笔不同的数据,两次读取同笔数据有了不同的数据。出现这种根本原因是在事务A进行读操作时,其他事务对数据进行了修改。 读提交(Read Committed)是不足以解决的,需进行可重复读(Repeatable read)就能解决。

3、幻读:一个事务进行读取,分别读取到了不同的数据。需要注意的是这里针对的是数据条数,可以理解为针对多笔数据是个数据集,重点是对数据的新增,所以对表加锁就可以解决。 个人理解:事务A对数据进行查询,这时事物B开启,对其中一笔数据进行了新增,然后进行了提交(这里进行了提交),然后事务A又对数据进行了查询,发现查询所得的结果集是不一样的。幻读针对的是多笔记录。读提交(Read Committed)是不足以解决的,需进行Serializable 序列化就能解决

成为第一个本话题的爱慕者吧

评论数量:0