HOME 首页
SERVICE 服务产品
XINMEITI 新媒体代运营
CASE 服务案例
NEWS 热点资讯
ABOUT 关于我们
CONTACT 联系我们
创意岭
让品牌有温度、有情感
专注品牌策划15年

    数据库为什么要查询优化(数据库为什么要查询优化的数据)

    发布时间:2023-04-21 21:51:26     稿源: 创意岭    阅读: 70        

    大家好!今天让创意岭的小编来大家介绍下关于数据库为什么要查询优化的问题,以下是小编对此问题的归纳整理,让我们一起来看看吧。

    开始之前先推荐一个非常厉害的Ai人工智能工具,一键生成原创文章、方案、文案、工作计划、工作报告、论文、代码、作文、做题和对话答疑等等

    只需要输入关键词,就能返回你想要的内容,越精准,写出的就越详细,有微信小程序端、在线网页版、PC客户端

    官网:https://ai.de1919.com

    创意岭作为行业内优秀的企业,服务客户遍布全球各地,如需了解SEO相关业务请拨打电话175-8598-2043,或添加微信:1454722008

    本文目录:

    数据库为什么要查询优化(数据库为什么要查询优化的数据)

    一、SQL数据库查询的优化

    1,使用合理的表结构,尽量减少表关联,有时宁愿多占用些空间,存储些在别的表中存在的重复字段。

    2,合理使用索引。

    3,使用存储过程。

    4,注意SQL语句的写法。针对“从下而上”解析的数据库系统,将关键性语句条件(比如主键、索引,确定的值等)放置在后面。反之,放置在前面。比如SQLSERVER数据库,你应当将首先去除了大部分记录的条件放置在where的前面部分。

    举例:

    假设主键为key;创建日期为 c_date,你的条件中包含对key和c_date的范围查询,那么你应当写成:

    where

    key >= @from_key and key <= @to_key and

    c_date >= @from_date and c_date <= @to_date

    而不应该写成:

    where

    key c_date >= @from_date and c_date <= @to_date and

    >= @from_key and key <= @to_key

    它们速度是不一样的。

    以上几点都将提高查询速度!

    第二次回答:

    有人对第三条“使用存储过程”提高效率有异议,那么请问,你认为存储过程除了可以完成复杂的判断和较复杂的运算、集中控制之外的主要作用是什么?

    在运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。这种已经编译好的过程可极大地改善SQL语句的性能。由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执行。

    任何一个设计良好的数据库应用程序都应当尽可能地用到存储过程。

    我提到的以上几点,是针对入门者而言,也是比较容易做到的,对于要深入研究这个问题的,那么这些远远不够,但是,做好这些,可以将速度提高一大截了。

    二、为什么要用mysql索引优化数据库

    说一下不同引擎的优化,myisam读的效果好,写的效率差,这和它数据存储格式,索引的指针和锁的策略有关的,它的数据是顺序存储的(innodb数据存储方式是聚簇索引),他的索引btree上的节点是一个指向数据物理位置的指针,所以查找起来很快,(innodb索引节点存的则是数据的主键,所以需要根据主键二次查找);myisam锁是表锁,只有读读之间是并发的,写写之间和读写之间(读和插入之间是可以并发的,去设置concurrent_insert参数,定期执行表优化操作,更新操作就没有办法了)是串行的,所以写起来慢,并且默认的写优先级比读优先级高,高到写操作来了后,可以马上插入到读操作前面去,如果批量写,会导致读请求饿死,所以要设置读写优先级或设置多少写操作后执行读操作的策略;myisam不要使用查询时间太长的sql,如果策略使用不当,也会导致写饿死,所以尽量去拆分查询效率低的sql,

    三、怎样优化数据库查询?怎样才能提高数据库的查询效率

    网上有好多这方面的帖子,但我就不去找了。把我知道的几点给你列一下。

    第一点:网速得给力,也就是应用服务器和数据库服务器之间不要做过多限制,特别是防火墙方面的,最好在一个网段

    第二点:使用数据库连接池,无需创建连接,直接查询

    第三点:查询语句上要明确指定查询那些列

    第四点:连接查询,嵌套查询方面要仔细斟酌,选择最优的方案

    第五点:分清各个函数、一些语法的特性,比如要分得清什么时候用 exists 什么时候用in

    第六点:随着数据量的增大,再好的语句也会慢下来,可以考虑利用分区

    。。。

    其他方面还有,可以查看下论坛上的帖子总结一下

    四、如何优化数据库中数据的查询

    1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:

    select id from t where num is null

    可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:

    select id from t where num=0

    2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。

    3.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:

    select id from t where num=10 or num=20

    可以这样查询:

    select id from t where num=10

    union all

    select id from t where num=20

    4.in 和 not in 也要慎用,因为IN会使系统无法使用索引,而只能直接搜索表中的数据。如:

    select id from t where num in(1,2,3)

    对于连续的数值,能用 between 就不要用 in 了:

    select id from t where num between 1 and 3

    5.尽量避免在索引过的字符数据中,使用非打头字母搜索。这也使得引擎无法利用索引。

    见如下例子:

    SELECT * FROM T1 WHERE NAME LIKE ‘%L%’

    SELECT * FROM T1 WHERE SUBSTING(NAME,2,1)=’L’

    SELECT * FROM T1 WHERE NAME LIKE ‘L%’

    即使NAME字段建有索引,前两个查询依然无法利用索引完成加快操作,引擎不得不对全表所有数据逐条操作来完成任务。而第三个查询能够使用索引来加快操作。

    6.必要时强制查询优化器使用某个索引,如在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:

    select id from t where num=@num

    可以改为强制查询使用索引:

    select id from t with(index(索引名)) where num=@num

    7.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:

    SELECT * FROM T1 WHERE F1/2=100

    应改为:

    SELECT * FROM T1 WHERE F1=100*2

    SELECT * FROM RECORD WHERE SUBSTRING(CARD_NO,1,4)=’5378’

    应改为:

    SELECT * FROM RECORD WHERE CARD_NO LIKE ‘5378%’

    SELECT member_number, first_name, last_name FROM members

    WHERE DATEDIFF(yy,datofbirth,GETDATE()) > 21

    应改为:

    SELECT member_number, first_name, last_name FROM members

    WHERE dateofbirth < DATEADD(yy,-21,GETDATE())

    即:任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。

    8.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:

    select id from t where substring(name,1,3)='abc'--name以abc开头的id

    select id from t where datediff(day,createdate,'2005-11-30')=0--‘2005-11-30’生成的id

    应改为:

    select id from t where name like 'abc%'

    select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'

    9.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

    10.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。

    11.很多时候用 exists是一个好的选择:

    elect num from a where num in(select num from b)

    用下面的语句替换:

    select num from a where exists(select 1 from b where num=a.num)

    SELECT SUM(T1.C1)FROM T1 WHERE(

    (SELECT COUNT(*)FROM T2 WHERE T2.C2=T1.C2>0)

    SELECT SUM(T1.C1) FROM T1WHERE EXISTS(

    SELECT * FROM T2 WHERE T2.C2=T1.C2)

    两者产生相同的结果,但是后者的效率显然要高于前者。因为后者不会产生大量锁定的表扫描或是索引扫描。

    以上就是关于数据库为什么要查询优化相关问题的回答。希望能帮到你,如有更多相关问题,您也可以联系我们的客服进行咨询,客服也会为您讲解更多精彩的知识和内容。


    推荐阅读:

    表格怎么根据某个关键字筛选(表格怎么根据某个关键字筛选数据)

    2022年网购数据分析(2022年网购数据分析年龄)

    南京数据分析公司(南京数据分析公司外企)

    火8宫意外死(8宫 火星)

    花洒品牌排行榜(花洒品牌排行榜前十名2022)