1.基础入门:
1.常见命令:
- 查看当前所有的数据库 show databases;
- 打开指定的库 use 库名;
- 查看当前库的所有表 show tables;
- 查看当前其他库的所有表 show tables from 库名;
- 创建表 creat table 表名
( 列名 列类型,
列名 列类型,
。。。 ); - 查看表结构 desc 表名;
- 查看服务器版本 select version();
2.MySQL 语法规范:
1.不区分大小写,单建议关键字大写,表名,列名小写
2.每条命令最好分号结尾
3.每条命令根具需要进行缩进或换行。
1.1 事务四大特性
以银行A账户向B账户转账为例子。
原子性,转账作为一个完整的事务, 1,A账户减少100元和 2,B账户增加100元不能分隔开。即该事务要么执行,要么不执行。
隔离性,假如A账户在向B账户转账的过程中同时C账户也在向B账户转账。即并行发生的事务相互隔离,按照串行操作来完成。
一致性,当转账事务执行完毕后,。A,B账户的总金额保持不变,即 事务前后,数据总额一致
持久性,一旦A,B转账事务提交,任何事务或者故障都不会导致数据丢失,即对数据的改变是永久性的。
1.2 事务的隔离级别
在描述事务隔离级别之前需要掌握几个基本概念:
1.脏写: 当事务并发运行的时候,事务A在对某一数据进行读写的时候,事务B 先于A对数据进行了重写,导致A回滚操作的时候覆盖了B重写的数据。
2.脏读: 同上理。事务A重写的数据但是还没等到回滚操作,事务B 就来读取了错误的数据。
3.不可重复读: 不同的事务A,B对同一数据读取的结果不一样,因为其中一个事务在读取之后还对数据进行了修改更新。
4.幻读: 当事务A读取某个范围的数据时,前后数据因为有其他的事务对数据进行插入和删除而导致数据不一样,产生了幻觉一样。
所谓的隔离级别就是对以上四种情况的一个允许程度。
读未提交:即可以读未提交的内容,查询不会加锁,即隔离的一致性是最差的。
读已提交:读已经提交的内容,能有效避免脏读,不能避免不可重复读,幻读等情况。
可重复读:专门针对“不可重复读”而制定的隔离级别,是MySQL默认的隔离级别,不允许在事务进行中对数据进行修改,能有效隔离不可重复读,但是不能避免幻读,幻读主要是因为插入和删除引起的。
串行化:最高的隔离级别,事务 串行化顺序执行,执行效率差。
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read-uncommitted) | 是 | 是 | 是 |
读已提交(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
2.如何提高查询速度?
在一个千百万级的数据表中,使用查询需要注意的是:首先是服务器硬件配置上的更新和优化。比如增加内存,使用多核处理器,硬盘升级等等措施。
1.数据库设计方面
- 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
- 从系统层面增强mysql的性能:优化数据表结构、字段类型、字段索引、分表,分库、读写分离等等。
2.SQL语句方面
- 优化 SQL 语句,合理使用字段索引。
- 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null; 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0;
- 避免在 where 子句中对字段进行 != 、<、>、 等符号判断,这会引发全盘扫描。
3.数据库操作上
- 从代码层面增强性能:使用缓存和NoSQL数据库方式存储,如MongoDB/Memcached/Redis来缓解高并发下数据库查询的压力。
- 减少数据库操作次数,尽量使用数据库访问驱动的批处理方法。
- 提升数据库服务器硬件配置,或者搭建数据库集群。
3.加了索引就快了?
Mysql索引主要有两种结构:B+Tree索引和Hash索引。我们平常所说的索引,如果没有特别指明,一般都是指B树结构组织的索引(B+Tree索引)。
- 最外层浅蓝色磁盘块1里有数据17、35(深蓝色)和指针P1、P2、P3(黄色)。P1指针表示小于17的磁盘块,P2是在17-35之间,P3指向大于35的磁盘块。真实数据存在于子叶节点也就是最底下的一层3、5、9、10、13……非叶子节点不存储真实的数据,只存储指引搜索方向的数据项,如17、35。
- 查找过程:例如搜索28数据项,首先加载磁盘块1到内存中,发生一次I/O,用二分查找确定在P2指针。接着发现28在26和30之间,通过P2指针的地址加载磁盘块3到内存,发生第二次I/O。用同样的方式找到磁盘块8,发生第三次I/O。
- 真实的情况是,上面3层的B+Tree可以表示上百万的数据,上百万的数据只发生了三次I/O而不是上百万次I/O,时间提升是巨大的。
是否需要创建索引?
索引虽然能非常高效的提高查询速度,同时却会降低更新表的速度。实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占用空间的。
建立索引的代价:
1.索引需要占硬盘空间,这是空间方面的代价。
2.一旦插入新的数据,就需要重新建索引,这是时间上的代价。所以,索引不适合需要大量增删改得表
建立索引的策略:
- 并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。
- 索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
- 应尽可能的避免更新索引数据列,因为索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新索引数据列,那么需要考虑是否应将该索引建为索引。
4.数据库索引底层结构
索引本质上是搜索查询的数据结构,常见的查询结构有顺序查找、二分查找、二叉排序树(实则也为二分查找)、平衡多路搜索树(B-Tree),其中B-tree中的变种 B+Tree 是大多树索引的最优查询结构。
其中-树和B+树最重要的一个区别就是B+树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域所以B+Tree 适合用作索引结构,存储外部数据于叶子节点上。
每次从磁盘中把数据拷贝到内存中 称为 一次 I/O 操作,相比与已经拷贝到内存中去进行搜索等操作,磁盘到内存之间的数据 I/O 所消耗的时间远多得多。所以尽可能减少I/O操作,是优化数据库的最大问题。
采用B+Tree存储结构,搜索时I/O次数一般不会超过3次,所以用B+Tree作为索引结构效率是非常高的。
5.mySQL与memcache的区别
6.mysql常见三种存储引擎
1. InnoDB存储引擎
InnoDB给MySQL的表提供了事务处理、回滚、崩溃修复能力和多版本并发控制的事务安全。
2.MyISAM存储引擎
MyISAM是MySQL中常见的存储引擎,曾经是MySQL的默认存储引擎。MyISAM是基于ISAM引擎发展起来的,增加了许多有用的扩展。
3.MEMORY存储引擎
Memory存储引擎是MySQL中的一类特殊的存储引擎。其使用存储在内存中的内容来创建表,而且所有数据也放在内存中。这些特性都与InnoDB,MyISAM存储引擎不同。
7.MySQL B+Tree索引和Hash索引的区别?
B+Tree索引,是一种严格平衡的多路搜索二叉树结构,在大范围搜索的情形之下拥有非常强大的搜索能力,一般最多经历3次I/O就可以找到所需要的数据。哈希索引即是利用不同的键值将其通过设定的哈希函数计算得到哈希地址,所以一般通过一次哈希算法即可立即定位到相应的位置,速度非常快。
但是:哈希索引不能检索范围查询,经过哈希函数计算得出的索引变成不连续了,就没有办法完成范围查询、顺序查询检索等,哈希还需要防止键值重复问题,哈希冲突等问题。但是在等值查询中,哈希的速度占据绝对优势。所以选择的时候还得看具体使用环境。
8.B+树索引和哈希索引的明显区别是:
如上:
9.非关系型数据库和关系型数据库区别,优势比较?
非关系型数据库:
- NOSQL 基于键值对,所以主键 + 值;查询速度极快。
- 基于键值对,数据之间没有耦合性,易于水平扩展,课扩展性强。
- 分布式,严格意义上不是数据库,而是一种结构化存储数据的一种集合。
关系型数据库:
- MySQL,可以用SQL语句在一个表或者多个表中做关联查询,所支持的可查询内容 较NOSQL 更加丰富。
- 安全性能高, 容易理解上手,二维化的表格便于人们操作理解。