数据库基础、原理、优化操作及方案

  数据库文件读写就要考虑到效率问题!在数据库中提高效率用到什么,是事务!如果一条条插入,其实每次插入都会维持一个事务,也就相当于文件的打开和关闭,10000次的打开和关闭是很消耗性能的,所以要在插入前使用BEGIN TRANSACTION开启事务,再10000条数据插入完成时用END TRANSACTION结束事务,这样就相对于文件只打开了一次,10000条批量操作完后,再关闭文件!”

-- 数据库MariaDB(腾讯推广的)- https://github.com/MariaDB/server/pull/246

MySQL数据量大时,优化可以进行的操作:MySQL分库分表,MySQL缓存,MySQL索引,MySQL优化查询语句? 其他数据库也类似,只是有些数据库的特性不一样。

-- 大牛是怎么思考设计SQL优化方案的- https://blog.csdn.net/xishining/article/details/86762109
 - 数据库优化维度有四个:
硬件、系统配置、数据库表结构、SQL及索引。

 - 优化选择:
优化成本:硬件>系统配置>数据库表结构>SQL及索引。
优化效果:硬件<系统配置<数据库表结构<SQL及索引。

SQL定位问题点顺序:硬件-->系统-->应用-->数据库-->架构(高可用、读写分离、分库分表)。
SQL优化方向:执行计划、索引、SQL改写。
架构优化方向:高可用架构、高性能架构、分库分表。

> SQL基础及提高:
常用SQL语句大全总结- http://blog.csdn.net/wanghong5211/article/details/68687004
SQL语句的CRUD-- http://www.cnblogs.com/cunkouzh/p/5588319.html
数据库- http://blog.csdn.net/x359981514/article/category/1269503
Android Cursor用法 - http://blog.csdn.net/baohanqing/article/details/19244911

SQL 基本知识- http://www.cnblogs.com/doubleyong/p/4312843.html
SQL关键字总结- http://www.cnblogs.com/ProgrammerGE/archive/2010/10/29/1864769.html
Sql语句常用关键字- http://blog.csdn.net/kenkao/article/details/4688336
SQL的多表操作- http://www.cnblogs.com/showonce/p/5947768.html
15 个常用的 SQL Server 高级语法- http://www.codeceo.com/article/15-sql-server-grammer.html

 

> 数据库事务四大特性(ACID):原子性(Atomicity);一致性(Consistency);分离性(Isolation);持久性(Durability);

 

理解事务——原子性、一致性、隔离性和持久性- https://blog.csdn.net/chosen0ne/article/details/10036775

 保证事务的原子性是分布式事物的最大难点,在分布式环境下,保证事务原子性主要有两种方案,一种是在提交命令发出后不回滚,尽可能保证提交成功;另一种是在提交命令发出后,根据响应结果判断是提交成功还是该进行回滚。
  事务的一致性
在单机数据库事务中,事务的一致性是指事务的任何操作都不会使得数据违反数据库定义的约束、触发器等规则。在分布式数据库中,由于数据分布在不同节点,有些约束难以保证,比如主键和唯一性约束,中信银行当前实现的版本未从数据库本身保证该约束的完整性,只能从使用规范角度进行约束,由应用保证主键和唯一索引的全局唯一性。
  事务的隔离性
事务隔离性的本质就是如何正确处理读写冲突和写写冲突,这在分布式事务中又是一个难点,因为在我们的分布式事务控制方案中,可能会出现提交不同步的现象,这个时候就有可能出现“部分已经提交”的事务。一旦并发应用访问“已经提交”节点中的数据,就需要根据GTID的状态来判断是“部分提交”还是“全部提交”,否则就出现了分布式数据库中特有的一种“脏读”。因此GTID方案可以确保分布式事务的隔离性。
  事务的持久性

和单机一样,分布式事务也需要保证事务的持久性,通过单节点数据的持久化和全局事务状态的持久化来完成,数据的持久化由单节点数据库保证,全局事务状态的持久化由全局事务管理器负责,全局事务管理器采用定时全量和实时增量方式实现事务状态的持久化:将GTID申请和释放的动作实时写到磁盘,同时每隔一定时间将全局事务管理中的活跃GTID列表以异步方式写到磁盘,通过定时的全量活跃GTID列表和实时的增量记录,可以获得任意时刻的活跃GTID列表。


  1.数据库触发器:CREATE TRIGGER trig_stu_update ON student FOR UPDATE AS begin end; CREATE TRIGGER trig_stu_delete ON student FOR DELETE AS begin end;
  2.数据库复合索引(聚集、非聚集索引、唯一索引、复合索引、系统自建索引):创建复合索引应当包含少数几个列,并且这些列经常在select查询里使用。
聚集、非聚集索引、唯一索引、复合索引、系统自建索引- http://sunct.iteye.com/blog/1933511
 单一索引是指索引列为一列的情况,即新建索引的语句只实施在一列上。 用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引)。
 同时有两个概念叫做窄索引和宽索引,窄索引是指索引列为1-2列的索引,如果不特殊说明的话一般是指单一索引。宽索引也就是索引列超过2列的索引。 
设计索引的一个重要原则就是能用窄索引不用宽索引,因为窄索引往往比组合索引更有效。拥有更多的窄索引,将给优化程序提供更多的选择余地,这通常有助于提高性能。
  3.数据库的数据源组件:
数据源控件包括那些所有实现 IDataSource 接口的控件。.NET Framework 包含以下数据源控件:
 SqlDataSource:连接到任意 ADO.NET 数据提供程序的数据源。
 ObjectDataSource:连接到自定义的数据访问类。(这是大型专业 Web 应用程序倾向使用的数据源控件)
 AccessDataSource:连接到 Access 数据库文件。用于小型网站,更好的小范围数据解决方案是使用免费的 SQL Server Express。
 XmlDataSource:连接到 XML 文件。
 SiteMapDataSource:连接到描述站点导航信息的 web.sitemap 文件。

> 数据库优化方案:缓存;数据库表的大字段剥离;恰当的使用索引;表库的拆分;字段冗余;从磁盘上做文章;放弃关系数据库的某些特性等;

主机性能;内存使用性能;网络传输性能;SQL语句执行性能。

数据库优化方案- http://database.51cto.com/art/201407/445934.htm

数据库水平切分的实现原理解析-分库,分表,主从,集群,负载均衡器- http://zhengdl126.iteye.com/blog/419850

Sharding-JDBC 源码分析- http://www.iocoder.cn/categories/Sharding-JDBC/?csdn&201

数据库事务有四种隔离级别:未提交读,提交读,可重复读,串行读。

数据库设计优化。sql优化。读写分离,分库分表。

> MySQL分库分表

 

  MySQL数据量大时,优化可以进行的操作:MySQL分库分表,MySQL缓存,MySQL索引,MySQL优化查询语句? 其他数据库也类似,只是有些数据库的特性不一样。

实例分析MySQL下的四种事务隔离级别- https://www.ziwenxie.site/2017/08/08/mysql-transaction-isolation/

   MySQL数据量大时,优化可以进行的操作:MySQL分库分表,MySQL缓存,MySQL索引,MySQL优化查询语句? 其他数据库也类似,只是有些数据库的特性不一样。

分库分表中间件汇总- http://blog.csdn.net/aisiyantou/article/details/50769942

1、Cobar(阿里,目前已不在维护)使用淘宝中间件cobar实现mysql分库分表- https://github.com/alibaba/cobar     
2、TDDL(阿里淘宝,需要用到阿里另外一个项目diamond配置中心)分布式数据层
3、ATLAS(奇虎360)负载均衡、读写分离,不支持分库分表
4、MyCat(以Cobar基础,号称中国第一开源框架

开源的分库分表中间件Sharding-JDBC,dubbox和elastic-job Kratos;
分库分表用于应对当前互联网常见的两个场景——大数据量和高并发。
  通常分为垂直拆分和水平拆分两种。
  垂直拆分是根据业务将一个库(表)拆分为多个库(表)。如:将经常和不常访问的字段拆分至不同的库或表中。由于与业务关系密切,目前的分库分表产品均使用水平拆分方式。
  水平拆分则是根据分片算法将一个库(表)拆分为多个库(表)。如:按照ID的最后一位以3取余,尾数是1的放入第1个库(表),尾数是2的放入第2个
库(表)等。
  单纯的分表虽然可以解决数据量过大导致检索变慢的问题,但无法解决过多并发请求访问同一个库,导致数据库响应变慢的问题。所以通常水平拆分都至少要采用分库的方式,用于一并解决大数据量和高并发的问题。这也是部分开源的分片数据库中间件只支持分库的原因。
  但分表也有不可替代的适用场景。最常见的分表需求是事务问题。同在一个库则不需考虑分布式事务,善于使用同库不同表可有效避免分布式事务带来的麻烦。目前强一致性的分布式事务由于性能问题,导致使用起来并不一定比不分库分表快。目前采用最终一致性的柔性事务居多。分表的另一个存在的理由是,过多的数据库实例不利于运维管理。
  无论使用哪种架构,核心逻辑均极为相似,除了协议实现层不同(JDBC或数据库协议),都会分为分片规则配置、SQL解析、SQL改写、SQL路由、SQL执行以及结果归并等模块。
  结果归并包括4类:普通遍历类、排序类、聚合类和分组类。

大型网站就是要同时满足高访问量和高数据量的要求,核心是通过分布式系统解决数据的处理、存储及访问问题。
消息中间件Notify;淘宝服务框架——HSF;淘宝分布式数据层TDDL

> 缓存,用redis/memcache做Mysql缓存层?
启用MySQL查询缓存- http://blog.csdn.net/ClementAD/article/details/46806469
MYSQL 缓存详解 [myownstars] 经典博客- http://www.cnblogs.com/zengkefu/p/5606342.html

> MySQL索引与优化
MySQL目前主要有以下几种索引方法:B-Tree,Hash,R-Tree。http://www.cnblogs.com/luyucheng/p/6289048.html
mysql索引结构原理、性能分析与优化- http://www.tuicool.com/articles/ZRN3qu
  在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,MyISAM和InnoDB两个存储引擎的索引实现方式。
MyISAM的索引文件仅仅保存数据记录的地址。在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。
  InnoDB表数据文件本身就是主索引。InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

任何数据库层面的优化都抵不上应用系统的优化.B+tree是B-tree的一个变种,大名鼎鼎的MySQL就普遍使用B+tree实现其索引结构。
MySQL索引原理及慢查询优化- http://blog.jobbole.com/86594/
mysql索引总结----mysql 索引类型以及创建- http://blog.csdn.net/xluren/article/details/32746183
理解MySQL——索引与优化- http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html


> 查询语句优化
善用Explain语句
Mysql常用30种SQL查询语句优化方法- http://blog.csdn.net/youthsunshine/article/details/53465847

根据数据库主键的字段类型,咱们可以将主键分为两类,分别为:
业务主键,即使用真实的业务数据作为主键,例如学号、课程编号等等,很少使用;
逻辑主键,即使用逻辑性的字段作为主键,字段没有业务含含义,值是没有都没有关系,经常使用。

MySQL数据量大时,优化可以进行的操作:MySQL分库分表,MySQL缓存,MySQL索引,MySQL优化查询语句? 其他数据库也类似,只是有些数据库的特性不一样。

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值