SQL Server、Oracle
,那么单表存储上亿条数据是没有问题的。如果数据表设计得好,即使不采用分库分表的方式,查询效率也不差。MySQL
进行存储,它有很多存储引擎可以选择,如果进行事务处理的话可以选择lnnoDB,非事务处理可以选择MylSAM。NoSQL
阵营包括键值型数据库
、文档型数据库
、搜索引擎
、列式存储
和图形数据库
。这些数据库的优缺点和使用场景各有不同,比如列式存储数据库可以大幅度降低系统的IO,适合于分布式文件系统,但如果数据需要频繁地增删改,那么列式存储就不太适用了。SQL查询优化,可以分为逻辑查询优化
和物理查询优化
。逻辑查询优化就是通过改变SQL语句的内容让SQL执行效率更高效,采用的方式是对SQL语句进行等价变换,对查询进行重写。
物理查询优化是在确定了逻辑查询优化之后,采用物理优化技术(比如索引等), 通过计算代价模型对各种可能的访问路径进行估算,从而找到执行方式中代价最小的作为执行计划。在这个部分中,我们需要掌握的重点是对索弓|的创建和使用
。
常用的键值存储数据库有 Redis 和 Memcached,它们都可以将数据存放到内存中。
库级优化是站在数据库的维度上进行的优化策略,比如控制一个库中的数据表数量。另外,单一的数据库总会遇到各种限制,不如取长补短,利用"外援"的方式。通过主从架构优化我们的读写策略,通过对数据库进行垂直或者水平切分,突破单一数据库或数据表的访问限制, 提升查询的性能。
垂直拆分(分库)
、水平拆分 (分表)
、垂直+水平拆分 (分库分表)
。但需要注意的是,分拆在提升数据库性能的同时,也会增加维护和使用成本。
优化MySQL服务器主要从两个方面来优化,一方面是对 硬件
进行优化;另一方面是对MySQL 服务的参数
进行优化。这部分的内容需要较全面的知识,一般只有专业的数据库管理员
才能进行这一类的优化。 对于可以定制参数的操作系统,也可以针对MySQL进行操作系统优化。
拆分表的思路是,把1个包含很多字段的表拆分成2个或者多个相对较小的表。这样做的原因是,这些表中某些字段的操作频率很高( 热数据
),经常要进行查询或者更新操作,而另外一些字段的使用频率却很低(冷数据
),冷热数据分离,可以减小表的宽度。如果放在一个表里面, 每次查询都要读取大记录,会消耗较多的资源。
MySQL限制每个表最多存储4096列,并且每一行数据的大小不能超过65535字节。表越宽,把表装载进内存缓冲池时所占用的内存也就越大,也会消耗更多的I0。冷热数据 分离的目的是:①减少磁盘I0,保证热数据的内存缓存命中率。②更有效的利用缓存,避免读入无用的冷数据
。
举例: 会员members表存储会员登录认证信息,该表中有很多字段,如id、姓名、密码、地址、电话、个人描述字段。其中地址、电话、个人描述等字段并不常用,可以将这些不常用的字段分解出另一个表。将这个表取名叫members_detail,表中有member_id、address、telephone、description等字段。这样就把会员表分成了两个表,分别为members表 和 members_detail表 。
举例:假设存在a和b两张表,需要的信息必须通过a表和b表联合查询得到;可以新建一个中间表c,将需要的信息从a和b表中提出并存到c中,后续直接从c中查询即可。
设计数据库表时应尽量遵循范式理论的规约,尽可能减少冗余字段,让数据库设计看起来精致、优雅。但是,合理地加入冗余字段可以提高查询速度。表的规范化程度越高,表与表之间的关系就越多,需要连接查询的情况也就越多。尤其在数据量大,而
且需要频繁进行连接的时候,为了提升效率,我们也可以考虑增加冗余字段来减少连接。
改进表的设计时,可以考虑优化字段的数据类型。这个问题在大家刚从事开发时基本不算是问题。但是,随着你的经验越来越丰富,参与的项目越来越大,数据量也越来越多的时候,你就不能只从系统稳定性的角度来思考问题了,还要考虑到系统整体的稳定性和效率。此时,优先选择符合存储需要的最小的数据类型
。
列的字段越大,建立索引时所需要的空间也就越大,这样一页中所能存储的索引节点的数量也就越少,在遍历时所需要的IO次数也就越多
,索引的性能也就越差
。
INT
型 。TIMESTAMP
存储时间DECIMAL
代替FLOAT和DOUBLE存储精确浮点数//1. 第一种方式
insert into student values(1,'zhangsan',18,1);
insert into student values(2,'lisi',17,1);
insert into student values(3,'wangwu',17,1);
insert into student values(4,'zhaoliu',19,1);
//2. 第二种方式:使用一条INSERT语句插入多条记录
insert into student values
(1,'zhangsan',18,1),
(2,'lisi',17,1),
(3,'wangwu',17,1),
(4,'zhaoliu',19,1);
第2种情形的插入速度要比第1种情形快
上述这些方法都是有利有弊的。比如:
因此,一定要结合实际的业务需求进行权衡。
禁止不带任何限制数据范围条件的查询语句
。比如:我们当用户在查询订单历史的时候,我们可以控制在一个月的范围内;
经典的数据库拆分方案,主库负责写,从库负责读。