1. MySQL常见的两种储存引擎

 1. InnoDB引擎: InnoDB引擎提供了对数据库acid事务的支持,并且还提供了行级锁和外键的约束,它的设计目标就是处理大数据容量的数据库系统,MySQL运行时,InnoDB会在内存中建立缓冲池,用于缓冲数据和索引,但是该引擎是不支持全文搜索,同时启动也比较慢,它是不会保存表的行数的,所以在并发度较高的场景下使用会提升效率的2. MyIASM引擎:MySQL默认引擎,但不提供事务的支持,也不支持行级锁和外键,因此当执行插入和更新语句是,执行写操作的时候需要锁定这个表,所以会导致效率会降低, 不过和InnoDB不同的是, MyIASM引擎是保存了表的行数,所以,如果表的读操作远远多于写操作时,且不需要事务的支持时,可以将MyIASM作为数据库引擎的首选.

2. 对MySQL索引的理解

 MySQL索引使用的数据结构主要有BTree索引和哈希索引.对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引.MySQL的BTree索引使用的是B树种的B+Tree,但对于主要的两种存储引擎的实现方式是不同的.MyISAM: B+Tree叶节点的data域存放的是数据记录的地址,在索引检索的时候,首先按照B+Tree搜索算法搜索索引,如果知道的key存在,则取出其data域的值,然后以data域的值为地址读取相应的数据记录,这被称为"非聚簇索引".InnoDB: 其数据文件本身就是索引文件,相比MyISAM,索引文件和数据文件是分离的,其表数据文件本事就是按B+Tree组织的一个索引结构,树的叶节点data域保存了完整的数据记录,这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引.这被称为"聚簇索引"(或聚集索引).而其余的索引都作为辅助索引,辅助索引的data域存储相应记录主键的值而不是地址,这也是和MyISAM不同的地方.在根据主索引搜索时,直接找到key所在的节点即可取出数据;在根据辅助索引查找时,则需要先出去主键的值,再走一遍主索引,因此,在设计表的时候,不建议使用过长的字段作为主键,也不建议使用费单调的字段作为主键,这样会造成主索引频繁的分裂.

3. 事务的四大特性(ACID)

 1.原子性(Atomicity):事务是最小的执行单位,不允许分割.事务的原子性确保动作要么全部完成,要么完全不起作用.2.一致性(Consistency):执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的.3.隔离性(Isolation): 并发访问数据库的时候,一个用户的事务不被其他事务干扰,各并发事务之间数据库是独立的4.持久性(Durability): 一个事务被提交之后.它对数据库中数据的改变是持久的,即使数据库发送故障也不应该对它有任何影响. '

3.2 事务的隔离级别

 1.读未提交(RU): 一个事务还没提交时,它做的变更就能被别的事务看到.2.读提交(RC): 一个事务提交之后,它做的变更才会被其他事务看到3.可重复读(RR): 一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的,当然在可重复读隔离级别下,未提交变更对其他事物也是不可见的.4.串行化(S): 对于同一行记录,读写都会加锁,当出现读写锁冲突的时候,后访问的事务必须等前一个事物执行完成之后才能继续执行.MySQL InnoDB存储引擎的默认支持的隔离级别是:RR 可重复读

3.3锁机制与InnoDB锁算法

 MyISAM采用表级锁InnoDB支持行级锁和表级锁,默认为行级锁;表级锁和行级锁对比:* 表级锁: MySQL中锁定**粒度最大**的一种锁,对当前操作的整张表加锁,实现简单,资源消耗也比较少,加锁快,不会出现死锁.其锁定粒度最大,触发锁冲突额概率最高,并发最低,MyISAM和InnoDB引擎都支持表级锁.* 行级锁: MySQL中锁定粒度最小的一种锁,只针对当前操作的行进行加锁,焊机所能大大减少数据库操作的冲突,其加锁粒度最小,并发度高,但加锁的开销也最大,加锁慢,会出现死锁.

3.4 数据库范式

第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项;
第二范式:要求实体的属性完全依赖主关键字.所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,(在第一范式基础上消除非主属性对主键的部分函数依赖)
第三范式:任何非主属性不依赖于其他非主属性;(在第二范式基础上消除传递依赖)

3.5 优化数据库查询

1. 尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引
2. 尽量避免在where子句中使用!=或者<>操作符
3. 尽量避免在where子句中对字段进行null值判断
4. 尽量避免在where子句使用or来连接条件
5. 尽量避免在where子句中对字段进行表达式操作
6. 尽量避免在where子句中对字段进行函数操作
7. in和not in要慎重使用,否则会导致全表扫描,很多时候用exists代替in是一个不错的选择

3.6 在数据控中条件查询速度很慢的时候,如何优化

1. 建立索引
2. 减少表之间的关联
3. 优化sql 尽量让sql利用索引定位数据,不要让sql做全表查询
4. 简化查询字段,没用的字段不要写,已经对返回结果的控制,尽量返回少量数据
5. 利用分页查询减少返回的数据量

3.7 sql语句关键词的执行顺序

1. FROM 组装来自不同数据源的数据
2. WHERE 基于指定的条件对记录进行筛选
3. GROUP BY 将数据划分为多个组
4. 使用聚合函数进行计算
5. 使用HAVING筛选分组
6. 计算所有表达式
7. 使用ORDER BY 对结果集进行排序
8. 即:from-->where-->group by-->having-->计算所有的表达式-->order by-->select输出

3.8 如何设计一个高并发系统

1.数据库的优化,包括合理的事务隔离级别,SQL语句优化,索引的优化
2.使用缓存,尽量减少数据库IO
3. 分布式数据库,分布式缓存
4. 服务器的负载均衡

3.9 乐观锁与悲观锁(并发控制主要采取的手段)

 乐观锁: 假定不会发生冲突,只在提交的时候检查是否发生并发冲突(可以使用版本号机制和CAS算法实现)CAS机制: compare and swap(比较与交换)  无锁编程,在不适用所得情况下实现多线程之间的变量同步,也就是在没有现成被阻塞的情况下实现变量的同步,因此也叫非阻塞同步;乐观锁的优劣势:优势: 乐观锁机制避免了长事务中的数据库加锁解锁开销,大大提升了大并发量下的系统整体性能表现,乐观锁也适用于读比较多的场景劣势: 乐观锁只能在提交数据时才发现业务事务将要失败,如果系统的冲突非常多,而且一旦冲突就要因为重新计算提交而造成较大的代价的话,乐观锁也会带来很大的问题,而且乐观锁也无法解决脏读的问题.悲观锁: 假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作,在读取的时候就对数据进行加锁,在读取数据期间,其他任何用户都不能来修改该数据,但是其他用户可以读取该数据,只有当自己读取完毕才释放锁.在数据库中可以使用可重复读来实现悲观锁,它完全满足悲观锁的要求(加锁).java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现悲观锁的优劣势:优势:能避免冲突的发生劣势: 开销较大,而且加锁时间比较长,对于并发的访问性能支持不好.事务和锁的存在都是为了更好地解决并发访问造成的数据不一致性问题,乐观锁可以看做是一种在最后提交时检测冲突的手段,而悲观锁是一种避免冲突的手段一般乐观锁适用于比较少的情况下(多读场景),悲观锁适用于多写的情况,多写的情况一般会经常发送冲突

3.10 共享锁和排它锁

 共享锁和排它锁是具体的锁,是数据库机制上的锁* 共享锁(读锁): 在同一个时间段内,多个用户可以读取同一个资源,读取过程中数据不会发生任何变化,读锁之间相互不阻塞,多个用户可以同时读,但不允许有人修改* 排它锁(写锁): 在任何时候只能有一个用户写入资源,当进行写锁时会阻塞其他的读锁或者写锁操作,只能由这一个用户来写,其他用户即不能读也不能写.加锁的粒度,从粒度的从高达到啊可以划分为:*表锁: 开销较小,一旦有用户访问这个表就会加锁,其他用户就不能对这个表操作,应用程序的访问请求遇到锁等待的可能性比较高.* 页锁:介于行级锁与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力也同样介于他们之间,页级锁定和行级锁定一样,会发送死锁* 行锁: 开销较大,能具体的锁定到表中的某一行数据,但是能更好的支持并发处理,会发送死锁

3.11 什么是存储过程,有哪些优缺点?

 存储过程是一个预编译的SQL语句优点是允许模块化的设计,就是说只需要创建一次,以后再该程序中就可以调用多次,如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快,可以用一个命令对象来调用存储过程

憨批豪的java成长日记-MYSQL数据库相关推荐

  1. 获取mysql可行方法_Mysql学习Java实现获得MySQL数据库中所有表的记录总数可行方法...

    <Mysql学习Java实现获得MySQL数据库中所有表的记录总数可行方法>要点: 本文介绍了Mysql学习Java实现获得MySQL数据库中所有表的记录总数可行方法,希望对您有用.如果有 ...

  2. java写的MySQL数据库备份和恢复代码:

    1.MySQL数据库备份和恢复,java代码实现:详情见下面: package com.spring.util; import java.io.BufferedReader; import java. ...

  3. java jdbc 连接mysql数据库 实现增删改查

    好久没有写博文了,写个简单的东西热热身,分享给大家. jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打 ...

  4. Java程序向MySql数据库中插入的中文数据变成了问号

    找到mysql的安装目录,修改my.ini文件 (1)如何找到my.ini文件 如果my.ini文件不在MySQL的安装目录下,可能放在隐藏目录,要先去找到ProgramData,(这里要先打开显示隐 ...

  5. eclipes Java代码连接Mysql数据库

    Java代码连接Mysql数据库C 一.插件的下载与加载 1.下载与本地的MySQL对应版本的连接数据库的包,如mysql-connector-java-8.0.17.jar 下载Connector/ ...

  6. java JDBC连接MySQL数据库调用存储过程进行查询

    java JDBC连接MySQL数据库调用存储过程进行查询 主程序代码 工具类 文件信息 存储过程 结果截图 主程序代码 package Mysql;import util.JDBCUtils; im ...

  7. Java JDBC 连接MySQL数据库方法(IJ版)

    Java JDBC 连接MySQL数据库方法(IJ版) 首先说一下IJ建立项目步骤: 1.新建一个Empty Project 2.新建一个Module 3.在src里新建一个Package 4.在Pa ...

  8. java向mysql写入数据慢_通过java代码往mysql数据库中写入日期相关数据少13个小时...

    通过show variables like '%time_zone%'; 查看时区: CST 时区 名为 CST 的时区是一个很混乱的时区,有四种含义: 美国中部时间 Central Standard ...

  9. Java 程序读取Mysql数据库时间信息与真实时间相差 13、14 小时、SQLException: HOUR_OF_DAY: 2 -> 3

    CST时区引起的异常: Java 程序读取Mysql数据库时间信息,与真实时间相差 13.14 小时 java.sql.SQLException: HOUR_OF_DAY: 2 -> 3 原因: ...

最新文章

  1. 在tomcat下创建和发布WEB应用
  2. python实现登录网站下载文件-Python爬虫 登录网页后下载图片,怎么保持登录状态?...
  3. 格式工厂软件处理视频
  4. 为什么要写《机器学习实践应用》这本书
  5. 使用CGContext画线操作小记
  6. 单元测试unittest(基于数据驱动的框架:unittest+HTMLTestRunner/BeautifulReport+yaml+ddt)...
  7. springcloud-05-ribbon中不使用eureka
  8. JUnit5 预期的异常 – assertThrows()示例
  9. css3 transition 和 animation实现走马灯
  10. vue element-UI的树形结构,父级关联,返回数据反选的问题
  11. MathType几个常用字体的名称
  12. MYSQL select ....outfile.....from.....
  13. Linux 用户空间审计系统
  14. Disease Ontology:人类疾病分类数据库
  15. win7 计算机定时关机脚本,定时关机命令,教您怎么使用命令行定时关机
  16. 每日一题-12.30-三态数据总线
  17. 计算机算log的原理,一位业余爱好者的研究,原本是第一台机械计算器,就这么胎死腹中...
  18. RabbitMQ高可用--Quorum Queue(仲裁队列)的原理
  19. UVA 1449 Dominating Patterns
  20. [HAOI2006]旅行comf(枚举+最小生成树)

热门文章

  1. Jetson Xavier CAN(11)
  2. adb 强制删除系统应用
  3. 黑客新型攻击技术,使用智能灯泡窃取数据
  4. 从软件到片源!PC播放HDTV上手全攻略
  5. npm install 报错 - node篇
  6. 采药(c语言贪心算法)
  7. 如何关闭win10防火墙_Win技巧 | 如何关闭防火墙
  8. ZOJ 3952 Fibonacci Sequence Chicken Edition 新构造语言,思路转换
  9. 职场新人如何发公司内部邮件
  10. 在mac上进行运行flutter项目