`

SQL查询优化——数据结构设计

 
阅读更多

本文部分内容会涉及mysql,可能在其他数据库中并不适用。本章节只针对数据库结构设计做讨论,查询优化的其他内容待续。

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

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

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

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

本节只对数据结构设计不合理进行讨论,后续章节会继续讨论其他内容。

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

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

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

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

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

业务场景,决定了你要存储什么样的数据,但它不会决定你要如何存储这些数据。你可以简单的将这些信息存储到一张表里,例如user表。但当我们需要更多的信息,例如用户的附属属性(学校,住址等),如果全部塞到一张表里,对于小数据量的数据库不会有太大问题,但当遇到大数据量的场景时,查询就有可能变的缓慢。分表会是一个更好的解决方案,根据不同的业务场景,将这些信息分为两类,存储在不同的表里,是更加合理的解决方案。

这里要说的其实是,不要为了方便把所有的东西都塞到一张表里,虽然这样会让你的程序编写起来容易很多,但是会造成更多的问题。例如有些人会把1:N的关系存储到一张表里,这样就会带来数据冗余,坏处有很多,例如:针对N的写改删查都会变得很复杂;表体积变大、字段增多,造成查询缓慢;其他表链表查询时速度缓慢等等。

2、如果没有业务主键,应建立ID自增主键

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

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

较小的数据类型意味着较小的存储代价,且数据库能够更高效的利用缓存空间。存储引擎都会采用不同的方式对索引或者数据缓存在内容中,较小的数据类型意味着在有限的内容空间中,你能够存储更多有价值的数据。对于可变长度的varchar类型,如果我们设置的是20长度,但实际占用的只有10个长度,在载入内存时,占用的空间依旧是20而不是10。所以对于可变长度类型,合理的长度更为重要。

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

字段数量过多如果不是因为业务需且数据结构设计合理,大多会产生以下几个问题:

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

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

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

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

分表是解决字段过多的一个解决方案,数据库分表后,程序可能会改动比较大,但我们应该追求合理完美的软件设计,摒弃糟粕。分表后使用链表查询,或者在程序中做两次查询。有些人可能会觉得连表,性能一定很差,其实不然。连表意味着我们在同一个SQL中,可以使用两个索引,但是单表查询我们只能使用一个索引。如果索引设计合理,在大多数场景下(应该是大数据量场景),连表查询会比单表查询性能更高,甚至高出太多。曾经有过这样的场景,优化分表后画面变得没好多了。

5、添加字段注释

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

分享到:
评论

相关推荐

    SQL优化方案——性能优化

    ### SQL优化方案——性能优化 #### 一、引言 SQL优化是数据库管理中的关键环节之一,它直接关系到数据库系统的整体性能。合理的SQL优化能够显著提升查询速度、减少资源消耗,进而改善用户体验。本文根据提供的文件...

    sql 优化基础——程序员必看

    SQL优化案例通常会结合实际场景,比如通过添加合适的索引来避免全表扫描,或者调整SQL语句结构以减少连接操作,甚至重构数据库设计以优化数据访问模式。此外,还可以通过调整数据库参数、使用存储过程、并行执行等...

    sqlserver————oracle工具

    在"sqlserver——oracle工具"的标题中,我们关注的是在SQL Server和Oracle之间进行数据迁移的工具。常见的数据迁移工具有: 1. Oracle SQL Developer Data Pump:Oracle官方提供的免费工具,可以方便地导入导出数据...

    收获,不止SQL优化--抓住SQL的本质1

    - **逻辑结构**:合理设计表的逻辑结构能够有效提升查询效率。 - **表设计**:正确的表设计可以减少不必要的查询复杂度。 - **索引设计**:适当的索引能够显著提高查询速度。 - **表连接技巧**:掌握高效的表连接...

    SQL语法大全——中文版.pdf

    本资料"SQL语法大全——中文版.pdf"详细介绍了SQL的基本概念、语法和操作,旨在帮助用户更好地理解和运用SQL进行数据查询、插入、更新和删除等操作。 一、SQL基础 SQL包含以下几个主要部分: 1. 数据定义语言...

    SQL大总结——转载经典——价值过亿

    14. **性能优化**:SQL性能优化涉及索引策略、查询优化、内存管理和硬件配置等多个方面,是数据库管理员的重要工作。 《SQL大总结》文档很可能是对这些知识点的详细讲解和实例演示,读者可以通过学习来提升自己的...

    SQL for Palm——移动设备编程项目.pdf

    3. **查询优化**:在移动设备上,资源有限,因此优化SQL查询以减少内存消耗和提高执行速度至关重要。这可能涉及到索引的创建、查询计划的分析以及避免全表扫描等策略。 4. **事务处理**:在Palm设备上,数据一致性...

    学籍管理——sql设计

    "学籍管理——sql设计"这一主题涵盖了需求分析、概念模型构建、逻辑结构设计以及SQL语句的编写等多个步骤,这些都是构建高效、稳定且易于维护的数据存储系统的基础。 首先,需求说明是整个设计过程的起点。它明确了...

    收获,不止SQL优化 PDF 带书签 第三部分

    随后《收获,不止SQL优化——抓住SQL的本质》指引大家学会等价改写、过程包优化、高级SQL、分析函数、需求优化这些相关的五大神功。有点头晕,能否少一点套路?淡定,这还是“术”的范畴,依然是教你如何解决问题,...

    C# .NET MVC ——Easyui+PetaPoco+sqlserver数据库——理财后台管理系统

    综上所述,"C# .NET MVC ——Easyui+PetaPoco+sqlserver数据库——理财后台管理系统"的构建涉及到Web开发的多个层面,包括前端设计、后端逻辑以及数据库操作。通过合理利用这些技术,可以创建出功能强大、易于维护的...

    Microsoft_SQL_Server_2005技术内幕:T-SQL查询.pdf

    本书及其续篇——《Microsoft SQL Server 2005技术内幕:T-SQL程序设计》介绍了SQL Server 2005中高级T-SQL查询、查询优化及编程相关的知识。这两本书侧重于解决实践中的常见问题,并讨论了解决这些问题的方法。它们...

    Oracle——sql语句优化

    ### Oracle SQL语句优化策略详解 #### 操作符优化概览 在Oracle数据库环境中,SQL语句的优化是提升...在实际操作中,开发者和DBA应持续关注查询性能,不断调整和优化SQL语句,以适应不断变化的数据需求和技术环境。

    收获,不止SQL优化

    , 现在《收获,不止SQL优化——抓住SQL的本质》开始带你抛除烦恼,走进优化的可乐世界!, 首先教你SQL整体优化、快速优化实施、如何读懂执行计划、如何左右执行计划这四大必杀招。整这些干嘛呢?答案是,传授一个先...

    SQL Server 2005数据库实践教程——开发与设计篇-电子教案

    《SQL Server 2005数据库实践教程——开发与设计篇》是一份全面介绍SQL Server 2005数据库系统使用的电子教案。这份教程共分为7个章节,旨在帮助学习者掌握SQL Server 2005的核心概念、功能以及实际应用技巧。下面,...

    收获不止SQL优化

    第2章 风驰电掣——有效缩短SQL优化过程 24 2.1 SQL调优时间都去哪儿了 25 2.1.1 不善于批处理频频忙交互 25 2.1.2 无法抓住主要矛盾瞎折腾 25 2.1.3 未能明确需求目标白费劲 26 2.1.4 没有分析操作难度乱调优...

    SQL 2005课件——数据库全面学习

    “第3章 管理表”则深入到数据存储的细节,包括表的结构设计、字段类型选择、主键与外键的设定,以及索引的使用。理解这些内容对于优化查询性能至关重要。 “第4章 获取数据”介绍了SQL查询的基本语法,如SELECT...

    数据库课程设计报告——选修课系统——sql语言

    【数据库课程设计报告——选修课系统——sql语言】 本次课程设计主要目标是利用SQL语言构建一个选修课管理系统,旨在提升对数据库系统的理论知识理解与实践能力。该系统旨在帮助学校教务处管理全校学生的选修课活动...

    《数据挖掘原理与应用——SQL Server 2005 数据库》算法案例

    《数据挖掘原理与应用——SQL Server 2005 数据库》是一本深入探讨数据挖掘技术的书籍,其中包含了丰富的算法实例,旨在帮助读者理解并掌握如何在SQL Server 2005环境下进行数据挖掘实践。数据挖掘是利用统计学、...

    SQL优化的好工具——SQL Expert介绍.pdf

    通常情况下,SQL语句在执行过程中,随着数据库中数据量的增长或数据库结构的变化,其执行效率会受到影响,因而需要定期地对SQL语句进行调优。 为了应对性能问题,传统上人们会采用试错的方式,利用经验和专业知识对...

    图书管理系统 数据结构 c++ 课程设计 完整代码

    性能优化可能包括减少内存消耗、提高查询速度、优化数据结构等。 综上所述,这个图书管理系统涵盖了数据结构、C++编程、数据库原理、用户交互设计、权限管理等多个关键知识点,是学习和提升这些技能的良好实践项目...

Global site tag (gtag.js) - Google Analytics