数据库查询优化(主从表的设计)

 更新时间:2013年08月04日 14:42:21   作者:  
写过许多的数据库查询语句,面对过许多的问题,也在磕磕碰碰中学到了很多东西。昨天在看系统数据库设计与SQL代码时,突然“发现”了许多平常不屑看到的问题,于是就萌生了把它提出来思考的念头

举一个例子,我现在有一些新闻信息,它包括这些字段;新闻ID,新闻Name,新闻ShortIntro,新闻Detail,新闻PublishTime。我现在要把它存放在数据库中,然后从数据库中将其取出来放在GridView中分页显示。

我现在就以一种我所见过的常见的思维方式来一步一步模拟这个实现过程。

第一步:建立新闻数据表

在这一步,很多人都会直接建一张News表,里面包括了上面说的那些字段。

第二步:查询数据。

写一个方法,把News表中满足查询条件的数据取出来放在DataSet(DataTable)中,作为数据源。

第三步:绑定到GridView。

设置GridView的分页属性,将上面查询得到的数据源绑定到GridView,实现数据在GridView中的分页显示。

上面就是我们常见的做法了。

我的做法会是这样:

第一步:建立新闻数据主-从表

我们在系统开发过程中会发现,其实在一条的完整的数据信息中,其实很多时候,很多列表项并不会用到。我们分析News信息,我们可以初步的把ID,Name,ShortIntro,PublishTime作为主要信息,我们将这些信息集中起来,新建一张表News(ID,Name,ShortIntro,PublishTime),另外一个字段Detail放在另一张从表中,新建一张表NewsDetail(ID,Detail,NewsID)。这样做有什么好处呢,首先我们降低了表的“重量”。我们将最重要,最常用的信息简化出来放在一个主表中,这样在使用过程中,我们只需要从这张住表中获取我们所需的数据就可以了,而不需要像第一种方法一样遍历所有字段,这减少了数据库查询的时间,提高了性能。主-从表建立的原则是,将最重要的,最常用的分离出来作为主表,将那些描述性的,内容庞大的作为从表。

第二步:编写适合的SQL语句。

我们应该为不同的功能实现编写适合的SQL语句。上面那种方法中,用一个方法查询出了所有的数据信息,这是满足所有场合的数据要求的。但是,我们并不需要这么多的数据内容,多余的数据内容耗费了我们大量的时间和空间。我们往往只需要其中的部分内容,比如说主要信息。这也印证了为什么我们上面要建立主-从表。我们在建立了主-从表之后,为满足各种场合,可以编写以下几种方法:GetNews(int? ID, string Name)//从主表中查询满足条件的数据,GetNewsDetail(int? ID, string Name)//从主表和从表中查询满足条件的数据。第一种方法提供了新闻主要信息,第二种方法提供了全面的信息,这两种方法基本上就能满足所有场景且不会带来过多的数据冗余。这里还要指出一点,有些人喜欢这么写GetNewsByID(int? ID ),GetNewsByName(string Name),这样写是很灵活,很有针对性,但是这样写完全没必要。

第三步:分页绑定。

上面那种方法是一次性取出所有数据给GridView,让控件自己去分页,这样做方便省事。但是会有几个问题:

(1)数据量大。因为是一次性取出所有满足条件的数据,所以数据量比较大,而这些数据是都需要放在内存中的,所以会影响系统性能。而且在初次载入时会有些卡,给人的感觉是系统加载不平顺。

(2)我们并不需要这么多数据。为什么我要这么说呢?研究用户的使用习惯我们会发现,用户大多数情况下并不会逐页的去浏览数据,用户关注的往往是前几页的前几条。所以取出来的数据很多时候并没有被用户查看。

所以在这里,使用分页查询的方式是更加合适的。每次只从数据库里面查询一页数据,这样系统负载小,页面载入平顺,而且完全能够满足用户的使用要求。有些人会问,你这样做不是会增加数据库IO次数,我想说的是,一次性获取大量冗余数据,并要承担冗余所带来的持久影响与这些比理论上增加的IO次数(用户并不会逐页查看,也就并不会产生那么多次分页查询)要小得多的访问相比,分页查询具有不可否定的优势。

相关文章

  • SQL中一些小巧但常用的关键字小结

    SQL中一些小巧但常用的关键字小结

    这篇文章主要给大家总结介绍了关于SQL中一些小巧但常用的关键字,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • sql注入之新手入门示例详解

    sql注入之新手入门示例详解

    这篇文章仅仅是对SQL注入进行了一个简单的入门知识的讲解,是sql注入的基础篇,有个好的开头能够帮助大家对SQL注入有一个具体清晰的了解和认识。下面来一起看看吧,有需要的可以参考借鉴。
    2016-09-09
  • 使用SQL Mail收发和自动处理邮件中的扩展存储过程简介

    使用SQL Mail收发和自动处理邮件中的扩展存储过程简介

    使用SQL Mail收发和自动处理邮件中的扩展存储过程简介...
    2006-12-12
  • Navicat图形化界面之Navicat Premium 12 安装与使用教程

    Navicat图形化界面之Navicat Premium 12 安装与使用教程

    Navicat premium 是一款数据库管理工具,它可以让你以单一程式同时连线到 MySQL、SQLite、Oracle 及 PostgreSQL 资料库,让管理不同类型的资料库更加的方便,下面通过本文给大家介绍Navicat Premium 12 安装使用教程,需要的朋友参考下吧
    2021-12-12
  • [转载]让SQL运行得更快

    [转载]让SQL运行得更快

    笔者在工作实践中发现,不良的SQL往往来自于不恰当的索引设计、不充份的连接条件和不可优化的where子句。在对它们进行适当的优化后,其运行速度有了明显地提高!下面我将从这三个方面分别进行总结
    2007-02-02
  • 使用DataGrip连接Hive的详细步骤

    使用DataGrip连接Hive的详细步骤

    这篇文章主要介绍了DataGrip连接Hive的详细图文教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 聚合函数和group by的关系详解

    聚合函数和group by的关系详解

    大家好,本篇文章主要讲的是聚合函数和group by的关系详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • 关于SQL注入中文件读写的方法总结

    关于SQL注入中文件读写的方法总结

    这篇文章主要给大家介绍了关于SQL注入中文件的读写方法,文中通过示例代码介绍的非常详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-03-03
  • 让你的insert操作速度增加1000倍的方法

    让你的insert操作速度增加1000倍的方法

    大家平时都会使用insert语句,特别是有时候需要一个大批量的数据来做测试,一条一条insert将会是非常慢的,那么我们如何让我们的inser更快呢。
    2009-08-08
  • 经常使用的JDBC连接数据库方式

    经常使用的JDBC连接数据库方式

    在我们开发中,几乎脱离不了连接数据库。并且无论是使用框架还是硬编码连接数据库,都避免不了写驱动类以及连接url。为了方便我们的开发,我们收藏常用的jdbc连接数据库方式。
    2013-04-04

最新评论