DBA推荐的7法宝提高SQL查询性能 (dba值得读吗)

教程大全 2025-07-20 18:49:10 浏览

SQL查询 数据库时,适当遵循一些原则可以让工作变得更加轻松,本文就列举7个可以灵活运用的原则,它们可以帮助你提高SQL查询速度,当然这些技巧你可以咨询DBA获得更多的信息。

1、用case代替update

要更新一条记录,我们立即会想到update,这个问题非常常见,许多开发人员经常忽视这个原则,因为使用update看起来非常自然,非常合乎逻辑。

假设你从Customer表中提取记录,你想将超过10万美元的订单标记为“Preferred”,因此你会想到使用一条update语句将CustomerRank列更新为“Preferred”,问题是update语句是有日志的,这就意味着每条记录它会写两次,解决这个问题的办法就是在SQL查询中内嵌case语句,在向表写入“Preferred”标志前,它会用订单金额条件对每一行进行检查,满足条件的才会更新,性能的提升是惊人的。

2、不要盲目地重用代码

这个问题也非常常见,在工作中直接用别人写好的代码是一件痛快的事情,你知道这些代码可以查询出你需要的数据,但问题是往往有些数据不是你需要的,但我们常常不愿意做一下修改,因此返回的数据集往往是一个超集,很可能多用一个外连接或是一个where子句就可以解决问题,因此在复用代码时***检查一下,如有必要略做适应性修改。

3、只提取你需要的列

这个问题和2有点类似,但这次是指定具体的列。也许我们在使用select * 时感觉很畅快,多省事呀!如果要将每个列名都写出来,太麻烦了,这是很多人的想法,但这种想法是错误的,因为这样做会取出多余的数据列,我无数次看到犯这种错误的代码,曾经有一位开发人员对一张有120列,上百万行数据的表使用select * 查询,但他只会用到其中的三五列,这是对资源的极大浪费,我们建议拒绝书写select * ,你要什么就查询什么,多余的返回结果对你没用,虽然不影响你要实现的功能,但对数据库性能却有极大的影响。

4、尽可能只查询一次大表

这也是我看到很多人犯的错误,例如,某存储过程从一张上百万条记录的大表中取数据,开发人员想提取居住在加利福利亚且收入高于4万美元的客户信息,因此它先将居住在加利福利亚的客户取出放在一张临时表中,然后再查询收入高于4万美元的客户,将查询结果放入另一张临时表中,***,他连接这两张临时表查询出最终的结果。

可能有人认为我是在开玩笑吧?但事实是确实有人这么做,这应该在一个查询中就能完成,却查询了两次大表。

有种稍微不同的情况是,当一个过程中的多个步骤需要大表的子集时,每一步可能都必须查询一次大表。避免多次查询的办法是持久化***次查询的子集,然后将后面的步骤指向该持久化子集。

5、使用临时表

这个问题解决起来可能稍微有点麻烦,但其效果比较明显,其实在很多时候你都可以使用临时表,通过临时表可以有效地减少对大表的操作,如果你必须连接一个表到大表,并且在大表上有条件,这时就可以将大表中需要的数据输出到临时表中,然后再用该临时表进行连接,这样查询速度会有明显改进。如果你的存储过程中有多个查询需要需要连接到相同的表时,也可以使用临时表。

6、预存数据

这一条是我最喜欢的,因为它是一项很老的技术,常常被人们忽视,如果你有一个报表或存储过程需要连接大表,提前提取大表中的数据,持久化存储到另一张表中,报表就可以使用预存的数据集,从而提高整体执行效率。

并不是所有时候你都有机会利用该技术,但一旦能利用上,你会发现它是节省 服务器 资源很有效的办法。

但遗憾的是,很多开发人员都在尽力回避这种技术,实际上只需要创建一个视图就可以把问题解决了,但这种方法的问题是每个需要它的报表运行时都会执行一次,但对于同一个报表,假设10分钟前运行了一次,现在有人要再运行该报表,那么对大表的连接操作就可以避免掉了。我建议对那些经常被查询的表使用该技术将数据预存起来,可以节省大量的服务器资源。

7、分批删除和更新

这也是一个容易被忽视的技巧,对一个大表做数据删除或更新操作,如果操作不当可能是一场噩梦,问题是这两种操作都是单一的事务,如果你需要杀死它们,或它们在执行时系统遇到问题,必须全部回滚整个事务,这个时间可能非常长,这就是为什么我们在删除数十万条记录时,如果试图中途杀死进程几乎没用的原因,这些操作也会影响到其它事务,搞不好会造成死循环,因此应慎用。

解决这个问题的办法就是分批少量删除或更新,首先,无论什么原因需要结束事务,只需要回滚少量的行,此外,小批量提交数据写入磁盘,对I/O的要求也更低,并发性可以大大提高。

另外要提醒的是,执行删除和更新操作应尽量选择非高峰时段。

总结

遵循这些方法总是能收到效果,但在实践中,我们应该根据实际情况,选用一种或几种***方案,来提高我们执行查询的速度,从而节省查询时间,提高查询效率。

【编辑推荐】


oracle的分页处理,oracle中针对一个一千条记录的表如果要查200到300的记录怎么查

Oracle有3种分页处理语句1、根据ROWID分页2、按分析函数分页3、按rownum分页其中1的效率最高,2的效率最低,3的效率比2好很多,比1的差距也很小,是经常使用的分页处理语句;3的语句有固定的格式,基本有以下步骤构成a、查询原表,从原表中取出分页中需要的字段,并排序select ename ,sal from emp Order by salb、对a取到的内容进行rownum编号select a1.*,rownum rn from (select ename ,sal from emp order by sal) a1 c、添加分页结束行号select a1.*,rownum rn from (select ename ,sal from emp order by sal) a1whererownum<=300d、添加分页开始行号select a2.* from (select a1.*,rownum rn from (select ename ,sal from emp order by sal) a1whererownum<=300) a2 where rn>=200d中的语句可以用作rownum分页的模板使用,使用时修改select ename ,sal from emp order by sal,开始行号,结束行号就可以了。

怎么学习SQL数据库的语句?

一、 简单查询简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。 它们分别说明所查询列、查询的表或视图、以及搜索条件等。 例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。 SELECT nickname,emailFROM testtableWHERE(一) 选择列表选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。 1、选择所有列例如,下面语句显示testtable表中所有列的数据:SELECT *FROM testtable2、选择部分列并指定它们的显示次序查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。 例如:SELECT nickname,emailFROM testtable3、更改列标题在选择列表中,可重新指定列标题。 定义格式为:列标题=列名列名 列标题如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列标题:SELECT 昵称=nickname,电子邮件=emailFROM testtable4、删除重复行SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认为ALL。 使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。 5、限制返回的行数使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是表示一百分数,指定返回的行数等于总行数的百分之几。 例如:SELECT TOP 2 *FROM testtable SELECT TOP 20 PERCENT * FROM testtable(二)FROM子句FROM子句指定SELECT语句查询及与查询相关的表或视图。 在FROM子句中最多可指定256个表或视图,它们之间用逗号分隔。 在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。 例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应使用下面语句格式加以限定:SELECT username, usertable,citytableWHERE =在FROM子句中可用以下两种格式为表或视图指定别名:表名 as 别名表名 别名(二) FROM子句FROM子句指定SELECT语句查询及与查询相关的表或视图。 在FROM子句中最多可指定256个表或视图,它们之间用逗号分隔。 在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。 例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应使用下面语句格式加以限定:SELECT username, usertable,citytableWHERE =在FROM子句中可用以下两种格式为表或视图指定别名:表名 as 别名表名 别名例如上面语句可用表的别名格式表示为:SELECT username, usertable a,citytable bWHERE =不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。 例如:SELECT _fname+_lnameFROM authors a,titleauthor ta(SELECT title_id,titleFROM titlesWHERE ytd_sales>) AS tWHERE _id=_idAND _id=_id此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。 (三) 使用WHERE子句设置查询条件WHERE子句设置查询条件,过滤掉不需要的数据行。 例如下面语句查询年龄大于20的数据:SELECT *FROM usertableWHERE age>20WHERE子句可包括各种条件运算符:比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!<范围运算符(表达式值是否在指定的范围):BETWEEN…AND…NOT BETWEEN…AND…列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……)NOT IN (项1,项2……)模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=302、列表运算符例:country IN (Germany,China)3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。 可用于char、varchar、text、ntext、datetime和smalldatetime等类型查询。 可使用以下通配字符:百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 [^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。 例如:限制以Publishing结尾,使用LIKE %Publishing限制以A开头:LIKE [A]%限制以A开头外:LIKE [^A]%4、空值判断符例WHERE age IS NULL5、逻辑运算符:优先级为NOT、AND、OR(四)查询结果排序使用ORDER BY子句对查询返回的结果按一列或多列排序。 ORDER BY子句的语法格式为:ORDER BY {column_name [ASC|DESC]} [,…n]其中ASC表示升序,为默认值,DESC为降序。 ORDER BY不能按ntext、text和image数据类型进行排序。 例如:SELECT *FROM usertableORDER BY age desc,userid ASC另外,可以根据表达式进行排序。 正文] 买电脑,打800-858-0410 国内最低价,还有优惠 上一页 1 2 3二、 联合查询UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联合查询。 UNION的语法格式为:select_statementUNION [ALL] selectstatement[UNION [ALL] selectstatement][…n]其中selectstatement为待联合的SELECT查询语句。 ALL选项表示将所有行合并到结果集合中。 不指定该项时,被联合查询结果集合中的重复行将只保留一行。 联合查询时,查询结果的列标题为第一个查询语句的列标题。 因此,要定义列标题必须在第一个查询语句中定义。 要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。 在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。 在自动转换时,对于数值类型,系统将低精度的数据类型转换为高精度的数据类型。 在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。 例如:查询1 UNION (查询2 UNION 查询3)三、连接查询通过连接运算符可以实现多个表查询。 连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。 在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。 当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。 连接操作给用户带来很大的灵活性,他们可以在任何时候增加新的数据类型。 为不同实体创建新的表,尔后通过连接进行查询。 连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于将连接操作与WHERE子句中的搜索条件区分开来。 所以,在Transact-SQL中推荐使用这种方法。 SQL-92标准所定义的FROM子句的连接语法格式为:FROM join_table join_type join_table[ON (join_condition)]其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一个表操作的连接又称做自连接。 join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。 内连接(INNER JOIN)使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。 根据所使用的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。 外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种。 与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。 交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑运算符等构成。 无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接连接。 例如:SELECT _id,_id,_infoFROM pub_info AS p1 INNER JOIN pub_info AS p2ON DATALENGTH(_info)=DATALENGTH(_info)(一)内连接内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。 内连接分三种:1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。 2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。 这些运算符包括>、>=、<=、<、!>、!<和><>。 3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。 例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社:SELECT *FROM authors AS a INNER JOIN publishers AS pON =又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state):SELECT a.*,_id,_name, authors AS a INNER JOIN publishers AS pON =(二)外连接内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件的行。 而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。 如下面使用左外连接将论坛内容和作者信息连接起来: SELECT a.*,b.* FROM luntan LEFT JOIN usertable as bON =下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市:SELECT a.*,b.*FROM city as a FULL OUTER JOIN user as bON =(三)交叉连接交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。 例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等于6*8=48行。 SELECT type,pub_nameFROM titles CROSS JOIN publishersORDER BY type

WINDOWS下怎么安装mysql数据库

dba值得读吗

用MSI安装包安装根据自己的操作系统下载对应的32位或64位安装包。 按如下步骤操作:第一步: 安装许可双击安装文件,在如下图所示界面中勾选“I accept the license terms”,点击“next”。 第二步: 选择设置类型如下图所示,有5种设置类型:Developer Default:安装MySQL服务器以及开发MySQL应用所需的工具。 工具包括开发和管理服务器的GUI工作台、访问操作数据的Excel插件、与Visual Studio集成开发的插件、通过NET/Java/C/C++/OBDC等访问数据的连接器、例子和教程、开发文档。 Server only:仅安装MySQL服务器,适用于部署MySQL服务器。 Client only:仅安装客户端,适用于基于已存在的MySQL服务器进行MySQL应用开发的情况。 Full:安装MySQL所有可用组件。 Custom:自定义需要安装的组件。 MySQL会默认选择“Developer Default”类型,个人建议选择纯净的“Server only”类型,减少对工具的依赖可以更深入的学习和理解MySQL数据库。 大家可根据自己的需求选择合适的类型,这里选择“Server only”后点击“next”。 第三步: 安装进入到安装步骤的界面,如果第二步选择的是其他类型也只是点击“next”即可进入到该步骤,点击“Execute”。 安装完成后点击“next”直到进入配置页面。 第四步: 配置进入到配置页面。 点击Content Type的下拉框,显示有三种类型:Development Machine:开发机器,MySQL会占用最少量的内存。 Server Machine:服务器机器,几个服务器应用会运行在机器上,适用于作为网站或应用的数据库服务器,会占用中等内存。 Dedicated Machine:专用机器,机器专门用来运行MySQL数据库服务器,会占用机器的所有可用内存。 根据自己的用途选择相应的类型配置,我这里为了后面做高并发性能测试便选择“Server Machine”类型。 选择好配置类型后进行连接配置。 常用的是TCP/IP连接,勾选该选项框,默认端口号是3306,可在输入框中更改。 若数据库只在本机使用,可勾选“Open Firewall port for network access”来打开防火墙,若需要远程调用则不要勾选。 下面的“Named Pipe”和“Shared Memory”是进程间通信机制,一般不勾选。 “Show Advanced Options”用于在后续步骤配置高级选项,为尽可能多的了解MySQL的可配置项,这里勾选该选项框。 点击“next”进入下一步。 第五步: 账户配置进入到MySQL的账户和角色配置界面。 root账户拥有数据库的所有权限,在密码框输入自己设置的密码。 数据库在开发和维护过程中为了安全性和便于管理会为不同的用户授予相应操作权限的账户密码,点击“Add User”按钮,在弹出的会话框中设置不同权限等级的账户。 Host表示能连接到该数据库的主机地址,可设置为本地(localhost/127.0.0.1)、一个外部IP(如218.17.224.228)、一个外部网段(如218.17.224.*)或者所有主机(%)。 Role表示该账户的角色。 不同的角色有着不同的权限等级,暂时可不做配置,后续会在用户权限管理章节详细讲解。 第六步: 配置Windows Service将MySQL服务配置成Windows服务后,MySQL服务会自动随着Windows操作系统的启动而启动,随着操作系统的停止而停止,这也是MySQL官方文档建议的配置。 Windows service Name可设置为默认值,只要与其它服务不同名即可。 在Windows系统中基于安全需求,MySQL服务需要在一个给定的账户下运行,选择默认的Standard System Account即可。 保持默认配置后点击“next”。 第七步: 高级配置因为在前面的第四步中勾选了“Show Advanced Options”选项,所以出现如下图所示的高级选项配置:在这里可配置各种日志文件的存储路径,它默认存储在MySQL安装目录的data目录下面,若非必须不建议改动。 Slow Query Log(慢查询日志)后面有一个Seconds配置项,默认值为10,表示一个SQL查询在经过10s后还没有查询出结果就会将此次查询记录到Slow Query Log中,方便DBA快速找到低效的操作。 Bin Log可用于主从数据同步。 最下面的Server Id用于Master-Slave配置。 这些都将在后续课程中讲到,这里保持默认配置即可。 点击“next”。 第八步: 服务器配置应用经过上述配置后,一个MySQL数据库已基本配置完成。 进入到这一步骤后点击“Execute”执行配置项。 安装成功,点击“Finish”完成。 用压缩包安装根据自己的操作系统下载对应的32位或64位的压缩包。 按如下步骤操作:第一步: 解压缩将压缩包解压到C:\Program Files\MySQL路径下,也可以自定义路径。 我的路径为C:\Program Files\MySQL\mysql-5.7.10-winx64。 第二步: 配置环境变量右键点击“计算机”,选择“属性”,依次打开“高级系统设置”->“环境变量”,在系统变量中选择“Path”项,并点击编辑。 保持原有值不变,并在末尾加上英文分号后追加C:\Program Files\MySQL\mysql-5.7.10-winx64\bin,将MySQL安装路径下的bin目录配置到Path变量中,使在命令行的任何目录下可以执行MySQL命令。 第三步: 修改配置打开MySQL安装目录下面的文件,找到basedir和datadir属性项,去掉前面的注释符号#,修改值如下:basedir = C:\Program Files\MySQL\mysql-5.7.10-winx64datadir = C:\Program Files\MySQL\mysql-5.7.10-winx64\data分别表示MySQL的安装目录和数据目录。 如果在第一步中解压缩到其它的文件夹则修改对应的值。 再将该文件重命名为。 第四步: 安装以管理员身份运行cmd,进入到MySQL的bin目录,执行初始化命令:mysqld --initialize --user=mysql --console1该命令用来初始化数据,在5.7以前的版本是不需要执行该命令的。 初始化完成后会提供一个临时的root密码,如下图红色方框,记下该密码。 再执行如下命令进行MySQL服务安装:mysqld –Install mysql1mysql为默认的服务名,可不写。 需要注意的是一定要以管理员身份运行cmd。 第五步: 启动服务在管理员cmd窗口中执行如下命令来启动MySQL服务:net start mysql1当出现如下图所示提示时表示MySQL安装并启动成功。 MySQL5.7以前的版本在安装时不需要执行第四步中的mysqld –initialize命令,如果漏掉该命令后在此步骤会出现如下错误:因为该版本的压缩包里面有些文件和文件夹(如data文件夹)需要在执行mysqld -initialize命令后才创建。 我在用5.6版本的安装步骤来进行安装时就在这里吃过很多亏,希望以此为戒,不再踩坑。 第六步: 登录执行如下命令:mysql -uroot -p1提示输入密码,输入第四步中记录下的密码,按回车后出现如下页面表示登录成功,并进入了MySQL命令行模式。 第七步: 修改密码在MySQL命令行执行如下命令:ALTER USER root@localhost IDENTIFIED BY new_password1大家改成自己的密码。 如果没有修改密码就执行其它的SQL命令。 经过以上步骤后MySQL服务器安装完成。

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐