赞
踩
MySQL 是一种关系型数据库,在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展。阿里巴巴数据库系统也大量用到了 MySQL(实际上他内部做了很多的修改),因此它的稳定性是有保障的。
MySQL的默认端口号是3306。
MySQL当前默认的存储引擎是InnoDB,并且在5.7版本所有的存储引擎中只有 InnoDB 是事务性存储引擎,也就是说只有 InnoDB 支持事务。当然,mysql是支持好多种存储引擎的
大多数时候我们使用的都是 InnoDB 存储引擎,但是在某些情况下使用 MyISAM 也是合适的比如读密集的情况下。(如果不考虑 MyISAM 崩溃恢复问题的话)。
MySQL索引使用的数据结构主要有BTree索引 和 哈希索引 。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree树索引。
索引是有空间消耗的。
聚簇索引和非聚簇索引都是采用的B+树,信息都是在叶子结点
聚簇索引
非聚簇索引(辅助索引)
顾名思义就是:最左优先。MySQL中的索引可以以一定顺序引用多列,这种索引叫作联合索引。最左前缀原则指的是,如果查询的时候查询条件精确匹配索引的左边连续一列或几列,则此列就可以被用到。
如User表的name和city加联合索引就是(name,city)
select * from user where name=xx and city=xx ; //可以命中索引
select * from user where name=xx ; // 可以命中索引
select * from user where city=xx ; // 无法命中索引
联合索引为(a,b,c)
select * from table where a = ‘1’ // 走索引
select * from table where a = ‘1’ and b = ‘2’ // 走索引
select * from table where a = ‘1’ and c = ‘3’ // 走索引
select * from table where a = ‘1’ and b = ‘2’ and c=‘3’ // 走索引
select * from table where b = ‘1’ and c = ‘3 // 不走索引
事务是逻辑上的一组操作,要么都执行,要么都不执行。经典案例:转账。事务就是保证这两个关键操作(A转出去,B接收到)要么都成功,要么都要失败。
脏读
丢失修改
不可重复读
幻读
不可重复读的重点是修改比如多次读取一条记录发现其中某些列的值被修改,幻读的重点在于新增或者删除比如多次读取一条记录发现记录增多或减少了。
READ-UNCOMMITTED(读取未提交)
READ-COMMITTED(读取已提交)
REPEATABLE-READ(可重复读)
SERIALIZABLE(可串行化)
MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)。事务隔离级别下使用的是Next-Key Lock 锁算法,因此可以避免幻读的产生。
Next-key lock:record+gap 锁定一个范围,包含记录本身
当我一个事务要对一个数据库中的一条数据进行修改的时候,为了避免同时被其他事务修改,最好的办法就是直接对该数据进行加锁以防止并发。这种借助数据库锁机制在修改数据之前先锁定,再修改的方式被称之为悲观并发控制(悲观锁)。
总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁,但是在更新时会判断其他线程在这之前有没有对数据进行修改,一般会使用版本号机制或CAS操作实现。
数据库连接本质就是一个 socket 的连接。数据库服务端还要维护一些缓存和用户权限信息之类的 所以占用了一些内存。我们可以把数据库连接池是看做是维护的数据库连接的缓存,以便将来需要对数据库的请求时可以重用这些连接。为每个用户打开和维护数据库连接,尤其是对动态数据库驱动的网站应用程序的请求,既昂贵又浪费资源。在连接池中,创建连接后,将其放置在池中,并再次使用它,因此不必建立新的连接。如果使用了所有连接,则会建立一个新连接并将其添加到池中。 连接池还减少了用户必须等待建立与数据库的连接的时间。
————————————————————————来源于javaguide的GitHub
采用大神一张图(javaguide):
需要说明一下就是:查询缓存(MySQL 8.0 版本后移除)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。