首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

数据库应用

1、概念:

数据库:简而言之,可视为电子化的文件柜

关系型数据库:关系型数据库是由多张能互相联接的二维行列表格组成的数据库

2、结论:

关系型数据库就是文件数据依据某种关系进行存储,修改、删除。这种强约束CRUD就是用SQL来实现。

3、问题:

文件存储就涉及到IO流、而电脑IO流相对于处理器、内存、硬盘是计算机最容易出现的瓶颈地方。

解决数据库瓶颈(大部分是解决IO流瓶颈)

一、查询本身的瓶颈

场景:如果数据库中有100万条数据,要筛选出其中一条最坏的情况是要循环查找100万次(最后一次循环找到数据)

解决方式1:索引

索引概念:

索引就相当于书的目录,要翻阅什么内容不需要从第一页依次翻阅查找,只需要看索引然后直接定位到目标页。(目录就相当于索引,目标页就相当于数据存储的真实物理地址),所以索引需要单独空间维护,索引空间会随着数据的增加而增加

数据库的索引分为聚集索引和非聚集索引

聚集索引:

是添加数据时初始化的排列方式(相当于书的目录,如果添加一篇内容就需要修改目录),修改一条数据就需要修改聚集索引。往往主键就是聚集索引,如果取消主键那么数据库会以第一个不为空的字段作为聚集索引。很明显决定书目录的方式只有一种,表中的聚集索引也只能有一个。

非聚集索引:

聚集索引以外的索引都是非聚集索引。非聚集索引往往是我们需要查询的条件上建索引。比如:我们在用户和年龄上建组合索引,这个组合索引会持有聚集索引的一个key值,如,在姓名、龄 字段上建组合索引,我们查询姓名为B的性别,对应到的聚集索引key是b,key b指向的是第2行的物理地址。第2行还有一个性别字段为女。这样通过非聚集索引查找到聚集索引定位到第2行查询出:B、20、女。如果只查询年龄,而组合索引中有年龄那么就不用再去找聚集索引。

何时使用索引?

最好所有查询都建索引

What?

1、 索引需要空间维护,浪费空间

2、 在更新数据时需要更新索引、会消耗时间

Why?

1、对于现在计算机世界中硬盘的空间是最容易扩容得,最大的瓶颈是IO流

2、软件开发者需要有大数据思维、现在数据量少建了索引可能会消耗一定时间,但是在小数据量下这点时间可以忽略不计,而在大数据量下不建索引带来的时间消耗可是量级的增加。

3、进入web2.0时代,查询是最主要的IO瓶颈

具体细节:

1.索引列排序

查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。

2.like语句操作

一般情况下不推荐使用like操作,如果非使用不可,如何使用也是一个问题。like “%java%” 不会使用索引而like “java%”可以使用索引。

3.不要在列上进行运算

这将导致索引失效而进行全表扫描,例如

SELECT * FROM table_name WHEREYEAR(column_name)

4.不使用not in和操作

解决方式2:分表分区

场景:项目开发中,随着数据库数据量越来越大,单个表中数据太多,从而导致查询速度变慢,而且由于表的锁机制导致应用操作也受到严重影响,出现了数据库性能瓶颈。

1、垂直分表

把一个表垂直切分为多个表,类似于数据库OneToOne的关系,比如:用户表中有用户名、密码、和用户详细说明,假如详细说明内容非常多,用户登录时候要频繁进行用户名和密码查询,那么用户详细说明就是负担,应该把他分割成一张表。

如上图所示:把用户表垂直分割成两个表,通过用户名进行关联,在查询的时候通过join关键字进行查询(如果要把两张表合并查询的话)

2、水平分表

水平分表是按表中的记录来划分的,说人话就是把一个表的数据用多张相同结构的表来存储。水平分表是最实用的一种分表方式,可以用关键字UNION进行查询(如果要合并多张表的情况)

如图所示:把上面的表根据序号取2的模分别放入下面两个表,这样查询的时候也那序号取2的模决定查询哪一个表。当然你可以按照你自己设定的规则来存储,比如按照时间。

二、并发访问的瓶颈

多用户并发访问的瓶颈是数据库服务器IO流量的瓶颈,因为每台数据库服务器IO流量都有一个极限,就好比我们连接WiFi信号,人多了就有人连接不上,因为WiFi本身就有一个IO瓶颈。

解决方式1:连接池

为什么要用连接池?

因为数据库其实是一个文件系统,所以需要建立IO流连接,而建立连接本身就是相当耗时的一个环节,所以我们在需要用数据库时,先创建N多个连接扔到连接池中,需要连接的时候直接去连接池中获取,不需要全新创建,减少创建连接的时间,数据库服务器IO流量总大小不变,内存被占用。

什么时候使用连接池?

最好任何时候都使用连接池,虽然连接占内存,但是在小数据范围内这点内存微乎其微,但是在大并发环境下,减少了创建连接的时间,效率会是一个量级的提高。

解决方式2:多数据库服务器

在高并发环境中,单数据库服务器不管如何优化它的IO流量总大小不会有任何改善。这个时候我们需要考虑用多个数据库服务器来支持高并发项目。

1、分表

上面我们说的分表是在一个数据库服务器中,这里的分表是把表建在不同的数据库中

2、主从分离

我们进入web2.0时代,查询远远大于修改,比如:周杰伦发一条微博会有几千万的粉丝进行查看。这时造成数据库的瓶颈就是查询。

主从分离:简单说就是主数据进行修改、从数据只进行查询,可以有N多个从数据库,从数据的数据和主数据库的数据一样,主数据库负责同步到从数据库。mysql的主从分离是从数据库同步主数据库的日志来完成。

数据存在不同的数据库中,那么如何进行数据操作喃?

1、代码业务逻辑实现,代码中可以持有多个数据源,代码中写业务去查询

2、通过数据库中间件比如mycat,中间件去连接多个数据库,我们只需要操作中间件,此刻你把中间件当成单数据源,如下图:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190125G0ESC400?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券