本文部分内容会涉及mysql,可能在其它数据库中并不适用。

本章节仅仅针对数据库结构设计做讨论。查询优化的其它内容待续。

数据库设计及使用是WEB开发程序猿必备的一项基础技能,在大数据量和高并发场景,合理的数据结构及SQL查询优化对项目来说都会显得格外重要。大部分有经验的程序猿都能了解到,程序的瓶颈往往不在程序本身,而在数据訪问层。造成数据訪问效率低下的原因有非常多,怎样解决这些问题。直接影响到应用的稳定性、健壮性。下面列举几个常见的问题:

  • 数据库锁表,查询堵塞
  • 高并发场景下。链接数量瓶颈
  • 查询效率低下。程序长时间无法退出
  • 写入性能低下。造成读写竞争激烈

以上仅仅是列出了数据库使用过程中比較常见的问题。出现这些问题的常见原因列举例如以下:

  • 数据结构设计不合理
  • 索引设计糟糕
  • 程序维护数据链接不合理
  • 程序猿太懒惰。数据库做了不擅长的工作
  • 数据冗余
  • SQL太渣

本节仅仅对数据结构设计不合理进行讨论。兴许章节会继续讨论其它内容。

一直认为作为一个中级以上水平的程序猿,查询优化是一项必备的基础技能。良好的数据结构设计,直接影响到后期软件的性能、健壮性、可维护性、可扩展性。见过非常多由于数据结构设计不合理而造成软件终于难以扩展。难以维护的场景。要避免这些问题。我们就要掌握良好的数据结构设计能力。

如何的数据结构才是合理的?这并没有一个完美通用的解决方式,要考虑详细的应用场景。但有一些准则,使我们应该尝试去遵守的。列举例如以下:

  1. 依据业务查询场景,考虑数据结构分布
  2. 假设没有业务主键,应建立ID自增主键
  3. 保证使用较小的数据类型。避免空间浪费
  4. 合理控制表的字段数量,必要时分表存储
  5. 加入字段凝视

针对以上几点,分别详述例如以下:

1、依据业务场景,考虑数据结构分布

业务场景,决定了你要存储什么样的数据,但它不会决定你要怎样存储这些数据。你能够简单的将这些信息存储到一张表里,比如user表。但当我们须要很多其它的信息。比如用户的附属属性(学校,住址等),假设所有塞到一张表里,对于小数据量的数据库不会有太大问题,但当遇到大数据量的场景时,查询就有可能变的缓慢。

分表会是一个更好的解决方式,依据不同的业务场景,将这些信息分为两类。存储在不同的表里。是更加合理的解决方式。

这里要说的事实上是。不要为了方便把全部的东西都塞到一张表里。尽管这样会让你的程序编写起来easy非常多,可是会造成很多其它的问题。

比如有些人会把1:N的关系存储到一张表里,这样就会带来数据冗余,坏处有非常多。比如:针对N的写改删查都会变得非常复杂;表体积变大、字段增多,造成查询缓慢;其它表链表查询时速度缓慢等等。

2、假设没有业务主键,应建立ID自增主键

主键是一条记录的唯一标志,没有主键在非常多时候我们无法得心应手的操作数据。可能在某些场景下。我们确实没有设置主键的必要,但不管你是否主动设置主键。数据库都会有一个主键(假设你没有主动设置。数据库默认会有一个ROW_ID列,而这一列是你看不到的)。主键在连表、查询等方面业务提供非常大帮助,所以不管怎样,建立一个主键是非常必要的

3、保证较小的数据类型,避免空间浪费

较小的数据类型意味着较小的存储代价,且数据库可以更高效的利用缓存空间。存储引擎都会採用不同的方式对索引或者数据缓存在内容中。较小的数据类型意味着在有限的内容空间中,你可以存储很多其它有价值的数据。

对于可变长度的varchar类型。假设我们设置的是20长度。但实际占用的仅仅有10个长度。在加载内存时。占用的空间依然是20而不是10。所以对于可变长度类型,合理的长度更为重要。

4、合理控制表的字段数量。必要时分表存储

字段数量过多假设不是由于业务需且数据结构设计合理,大多会产生下面几个问题:

  • 数据冗余
  • 索引过多
  • 表体积大

这里要提醒避免不必要的数据冗余,针对数据冗余的讨论我们暂且放在后面。

由于字段数据量多,往往查询场景也会很复杂多变,所以索引也就跟着变多了。索引多会直接影响到表的写入性能。这个性能的损耗是很大的。可能是数以十倍计算的时间损耗。在写入频繁的场景。有可能会出现写入瓶颈。由于写入而影响读取性能的问题或许多。

表体积大意味着数据库在读取数据的时候须要扫描很多其它更大的数据块,加载内存做缓存时也不能充分利用缓存带来的效果。表大小对于表的性能也是由为重要的。

分表是解决字段过多的一个解决方式。数据库分表后,程序可能会修改比較大,但我们应该追求合理完美的软件设计,摒弃糟粕。分表后使用链表查询,或者在程序中做两次查询。有些人可能会认为连表。性能一定非常差,事实上不然。连表意味着我们在同一个SQL中。能够使用两个索引,可是单表查询我们仅仅能使用一个索引。

假设索引设计合理,在大多数场景下(应该是大数据量场景)。连表查询会比单表查询性能更高,甚至高出太多。以前有过这种场景,优化分表后画面变得没好多了。

5、加入字段凝视

这里仅仅是为了提示规范化数据库设计。

原创文章,转载请注明: 转载自始终不够

本文链接地址: SQL查询优化——数据结构设计

版权声明:本文博主原创文章,博客,未经同意不得转载。

SQL查询优化——数据结构设计的更多相关文章

  1. MySQL 性能调优——SQL 查询优化

    如何设计最优的数据库表结构,如何建立最好的索引,以及如何扩展数据库的查询,这些对于高性能来说都是必不可少的.但是只有这些还不够,要获得良好的数据库性能,我们还要设计合理的数据库查询,如果查询设计的很糟 ...

  2. 引用:初探Sql Server 执行计划及Sql查询优化

    原文:引用:初探Sql Server 执行计划及Sql查询优化 初探Sql Server 执行计划及Sql查询优化 收藏 MSSQL优化之————探索MSSQL执行计划 作者:no_mIss 最近总想 ...

  3. 30条SQL查询优化原则

    在我们平常的SQL查询中,其实我们有许多应该注意的原则,以来实现SQL查询的优化,本文将为大家介绍30条查询优化原则. 首先应注意的原则 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 wher ...

  4. SQL查询优化 LEFT JOIN和INNER JOIN

    作者:VerySky 推荐:陈敬(Cathy) SQL查询优化 LEFT JOIN和INNER JOIN 1,连接了八个数据库表,而且全部使用LEFT JOIN,如下所示: Resource_Reso ...

  5. MySQL SQL查询优化技巧详解

    MySQL SQL查询优化技巧详解 本文总结了30个mysql千万级大数据SQL查询优化技巧,特别适合大数据里的MYSQL使用. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 ...

  6. 《打造扛得住的MySQL数据库架构》第7章 SQL查询优化

    SQL查询优化 7-1 获取有性能问题SQL的三种方法 如何设计最优的数据库表结构 如何建立最好的索引 如何拓展数据库的查询 查询优化,索引优化,库表结构优化 如何获取有性能问题的SQL 1.通过测试 ...

  7. AngularJS SQL 获取数据

    使用PHP从MySQL中获取数据: <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...

  8. Visual Basic 2012 借助DataGridView控件将SQL server2012 数据导入到Excel 2010

    摘  要: SQL Server 2012 数据和Excel 2010之间的连接和数据的传输,本篇文章主要针对的是SQL Server 2012 数据导入到Excel 2010文件中.Excel软件对 ...

  9. SQL server数据缓存依赖

    SQL server数据缓存依赖有两种实现模式,轮询模式,通知模式. 1  轮询模式实现步骤 此模式需要SQL SERVER 7.0/2000/2005版本以上版本都支持        主要包含以下几 ...

随机推荐

  1. java之jvm学习笔记十三(jvm基本结构)

    java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成 ...

  2. 解析php混淆加密解密的手段,如 phpjm,phpdp神盾,php威盾

    原文 解析php混淆加密解密的手段,如 phpjm,phpdp神盾,php威盾 php做为一门当下非常流行的web语言,常常看到有人求解密php文件,想当年的asp也是一样.一些人不理解为什么要混淆( ...

  3. 正确理解HTML,XHTML页面的头部doctype定义

    摘自http://www.west263.com/info/html/wangyezhizuo/css/20080225/42390.html 当我们制作页面的时候,总会在它的源代码头部看到一串声明, ...

  4. zoj2760(最大流)

    传送门:How Many Shortest Path 题意:给出n个点,和n*n的矩阵表示有向图.a[i][j]为-1表示i到j没有路径:不为-1则表示i到j的路径长度.给出一个vs和vt,要求vs到 ...

  5. Struts2中指定的校验文件不起作用的原因

    转载请注意出处:http://blog.csdn.net/bettarwang/article/details/39801733 我们知道,假设要为某个Action指定校验文件.那么就要将" ...

  6. unity3D游戏开发十八之NGUI动画

    我们先来看下帧动画,顾名思义,就是一帧帧的图片组成的动画,我们须要用到UISprite Animation组件,它的属性例如以下: Framerate:播放速率,也就是每秒钟播放的帧数 Name Pr ...

  7. 一次失败的刷题经历:[LeetCode]292之尼姆游戏(Nim Game)(转)

    最近闲来无事刷LeetCode,发现这道题的Accept Rate还是挺高的,尝试着做了一下,结果悲剧了,把过程写下来,希望能长点记性.该题的描述翻译成中文如下: 你正在和你的朋友玩尼姆游戏(Nim ...

  8. Java对Xml进行操作的实例(转)

    这是一个用JAVA W3C DOM 进行XML操作的例子,包含了查询.增加.修改.删除.保存的基本操作.较完整的描述了一个XML的整个操作流程.适合刚入门JAVA XML操作的朋友参考和学习. 假设有 ...

  9. [置顶] 生成学习算法、高斯判别分析、朴素贝叶斯、Laplace平滑——斯坦福ML公开课笔记5

    转载请注明:http://blog.csdn.net/xinzhangyanxiang/article/details/9285001 该系列笔记1-5pdf下载请猛击这里. 本篇博客为斯坦福ML公开 ...

  10. SpringMVC @ResponseBody 415错误处理

    在查看下面部分内容之前,请先检查你的请求蚕食是否正确,如果全部正确,请继续往下看 刚开始用SpringMVC, 页面要使用jQuery的ajax请求Controller. 但总是失败,主要表现为以下两 ...