提高mysql查询效率的方法有哪些

提高mysql查询效率的方法有哪些,第1张

1尽量不要在where中包含子查询;

关于时间的查询,尽量不要写成:where

to_char(dif_date,’yyyy-mm-dd’)=to_char(‘2007-07-01′,’yyyy-mm-dd’);

2在过滤条件中,可以过滤掉最大数量记录的条件必须放在where子句的末尾;

FROM子句中写在最后的表(基础表,driving

table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有三个以上的连接查询,那就需要选择交叉表

(intersection

table)作为基础表,交叉表是指那个被其他表所引用的表;

3采用绑定变量

4在WHERE中尽量不要使用OR

5用EXISTS替代IN、用NOT

EXISTS替代NOT

IN;

6避免在索引列上使用计算:WHERE

SAL12>25000;

7用IN来替代OR:

WHERE

LOC_ID=10

OR

LOC_ID=15

OR

LOC_ID=20

8避免在索引列上使用IS

NULL和IS

NOT

NULL;

9总是使用索引的第一个列;

10用UNION-ALL替代UNION;

11避免改变索引列的类型:SELECT…FROM

EMP

WHERE

EMPNO=’123’,由于隐式数据类型转换,to_char(EMPNO)=’123’,因此,将不采用索引,一般在采用字符串拼凑动态SQL语句出现;

12’!=’

将不使用索引;

13优化GROUP

BY;

14避免带有LIKE参数的通配符,LIKE

‘4YE%’使用索引,但LIKE

‘%YE’不使用索引

15避免使用困难的正规表达式,例如select

from

customer

where

zipcode

like

“98___”,即便在zipcode上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改成select

from

customer

where

zipcode>”98000″,在执行查询时就会利用索引来查询,显然会大大提高速度;

16尽量明确的完成SQL语句,尽量少让数据库工作。比如写SELECT语句时,需要把查询的字段明确指出表名。尽量不要使用SELECT

语句。组织SQL语句的时候,尽量按照数据库的习惯进行组织。

提升数据库性能可以提升查询速度,优化数据库结构,减少服务器压力等,那么如何优化数据库呢?昆明电脑培训>

1数据库I/O方面硬件性能

最有可能影响性能的是磁盘和网络吞吐量。解决办法:

·扩大虚拟内存,并保证有足够可以扩充的空间

·把数据库服务器上的不必要服务关闭掉

·把SQL数据库服务器的吞吐量调为最大

2调整数据库

·若对该表的查询频率比较高,则建立索引。

·分区(如MySQL,按时间分区)

·尽量使用固定长度字段和限制字段长度(如varchar(10))优势:

降低物理存储空间

提高数据库处理速度

附带校验数据库是否合法功能

3使用存储过程

应用程序的实现过程中,能够采用存储过程实现的对数据库的 *** 作尽量通过存储过程来实现。

因为存储过程是存放在数据库服务器上的一次性被设计、编码、测试,并被再次使用,需要执行该任务的应用可以简单地执行存储过程,并且只返回结果集或者数值。

这样不仅可以使程序模块化,同时提高响应速度,减少网络流量,并且通过输入参数接受输入,使得在应用中完成逻辑的一致性实现。

4SQL语句方面

建立查询条件索引仅仅是提高速度的前提条件,响应速度的提高还依赖于对索引的使用。不良的SQL往往来自于不恰当的索引设计、不充份的连接条件和不可优化的where子句。

·优化sql语句,减少比较次数

·限制返回条目数(mysql中使用limit)

合理使用索引;

避免或简化排序;

消除对大型表行数据的顺序存取;

避免相关子查询;

避免困难的正规表达式;

使用临时表加速查询。

数据表有两种含义,一是指数据库最重要的组成部分之一,二是指电子元件,电子芯片等的数据手册(datasheet)。

数据表一般为产品或资料提供一个详细具体的数据资料,方便人们使用和工作时能够清楚方便的获得相应的数据信息。

没有数据表,关键字、主键、索引等也就无从谈起。在数据库画板中可以显示数据库中的所有数据表(即使不是用PowerBuilder创建的表),创建数据表,修改表的定义等数据表是数据库中一个非常重要的对象,是其他对象的基础。

分布式系统就是将系统的应用层,数据层或其它部分构架成分布(物理和逻辑上的都可以)状(通常是网状)。分布式系统通常是为了增强系统的可扩展性、稳定性和执行效率。比如在线游戏通常就是分布系统,里面所谓的“区”就是分布系统里子例程。而分布式数据库其实也可以称作分布式系统,数据持久化层是分布的(数据存在不同的数据库中,可交互,有一套综管系统来维护数据的完整性和准确性)。所以说分布式系统更准确地说是一种系统构架概念,不是一种技术。

提高查询速度。

1、用程序中,

保证在实现功能的基础上,尽量减少对数据库的访问次数;

通过搜索参数,尽量减少对表的访问行数

最小化结果集,从而减轻网络负担;

够分开的 *** 作尽量分开处理,提高每次的响应速度;

在数据窗口使用

SQL 时,尽量把使用的索引放在选择的首列;

算法的结构尽量简单;

在查询时,不要过多地使用通配符如

SELECT FROM T1 语句,要用到几列就选择几列如:

SELECT COL1,COL2 FROM T1 ;

在可能的情况下尽量限制尽量结果集行数如:

SELECT TOP 300 COL1,COL2,COL3 FROM T1,

因为某些情况下用户是不需要那么多的数据的。

不要在应用中使用数据库游标,游标是非常有用的工具,但比使用常规的、面向集的SQL语句需要更大的开销;

按照特定顺序提取数据的查找。

2、避免使用不兼容的数据类型。例如

float和int、char和varchar、binary和varbinary是不兼容的。数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化 *** 作。

例如: 

SELECT name FROM employee WHERE salary >60000

在这条语句中,如salary字段是money型的,则优化器很难对其进行优化,因为60000是个整型数。 

我们应当在编程时将整型转化成为钱币型,而不要等到运行时转化。 

3、尽量避免在WHERE子句中对字段进行函数或表达式 *** 作,这将导致引擎放弃使用索引而进行全表扫描。如:

SELECT FROM T1 WHERE F1/2=100 应改为 

SELECT FROM T1 WHERE F1=1002 

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()) 

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

4、避免使用!=或<>、IS NULL或IS NOT NULL、IN ,NOT IN等这样的 *** 作符因为这会使系统无法使用索引,

而只能直接搜索表中的数据。例如:

SELECT id FROM employee WHERE id != 'B%' 

优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。

5、尽量使用数字型字段,一部分开发人员和数据库管理人员喜欢把包含数值信息的字段设计为字符型, 

这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接回逐个比较字符串中每一个字符,

而对于数字型而言只需要比较一次就够了。

6、合理使用EXISTS,NOT EXISTS子句。如下所示:

1SELECT SUM(T1C1)FROM T1

WHERE( (SELECT COUNT()FROM T2 WHERE T2C2=T1C2>0)

2SELECT SUM(T1C1) FROM T1 WHERE EXISTS( 

SELECT FROM T2 WHERE T2C2=T1C2) 

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

是索引扫描。 

如果你想校验表里是否存在某条纪录,不要用count()那样效率很低,而且浪费服务器资源。

可以用EXISTS代替。如:

IF (SELECT COUNT() FROM table_name WHERE column_name = 'xxx')

可以写成: 

IF EXISTS (SELECT FROM table_name WHERE column_name = 'xxx') 

经常需要写一个T_SQL语句比较一个父结果集和子结果集,

从而找到是否存在在父结果集中有而在子结果集中没有的记录,如: 

1SELECT ahdr_key FROM hdr_tbl a

---- tbl a 表示 tbl 用别名a代替

WHERE NOT EXISTS (SELECT FROM dtl_tbl b WHERE ahdr_key = bhdr_key) 

2SELECTahdr_key FROM hdr_tbl a LEFT JOIN dtl_tbl b ON ahdr_key = bhdr_key 

WHERE bhdr_key IS NULL 

3SELECT hdr_key FROM hdr_tbl WHERE hdr_key NOT IN (SELECT hdr_key FROM dtl_tbl)

三种写法都可以得到同样正确的结果,但是效率依次降低。

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

见如下例子:SELECT FROM T1 WHERE NAME LIKE ‘%L%’

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

SELECT FROM T1 WHERE NAME LIKE ‘L%’

即使NAME字段建有索引,前两个查询依然无法利用索引完成加快 *** 作,引擎不得不对全表所

有数据逐条 *** 作来完成任务。而第三个查询能够使用索引来加快 *** 作。 

8、充分利用连接条件,在某种情况下,两个表之间可能不只一个的连接条件,这时在 

WHERE 子句中将连接条件完整的写上,有可能大大提高查询速度。例:

SELECT SUM(AAMOUNT) FROM ACCOUNT A,CARD B WHERE ACARD_NO = BCARD_NO 

SELECT SUM(AAMOUNT) FROM ACCOUNT A,CARD B WHERE ACARD_NO = BCARD_NO 

AND AACCOUNT_NO=BACCOUNT_NO

第二句将比第一句执行快得多。 

9、消除对大型表行数据的顺序存取,尽管在所有的检查列上都有索引,但某些形式的

WHERE子句强迫优化器使用顺序存取。如: 

SELECT FROM orders WHERE (customer_num=104 AND order_num>1001) OR

order_num=1008 解决办法可以使用并集来避免顺序存取: 

SELECT *FROM orders WHERE customer_num=104 AND order_num>1001

UNION SELECT *FROM orders WHERE order_num=1008 这样就能利用索引路径处理查询。 

10、避免困难的正规表达式。

LIKE关键字支持通配符匹配,技术

你的数据库是什么数据库?如果是ACCESS,建议你导入到MySQL中去,MySQL据说是世界上执行速度最快的数据库了,如果是MSSQL,请使用存储过程执行查询,可以大提高数据库的运行速度。你的问题我曾经碰到过,当时我使用的是ACCESS数据库,数据库中的数据达到20万条记录了,查询起来速度特慢,后来改用MSSQL的存储过程,速度提高了很多,你试试吧,祝你成功!

1关于索引优化

建索引的选择必须结合SQL查询、修改、删除语句的需要,一般的说法是在WHERE里经常出现的字段建索引。如果在WHERE经常是几个字段一起出现而且是用AND连接的,那就应该建这几个字段一起的联合索引,而且次序也需要考虑,一般是最常出现的放前面,重复率低的放前面。

SQL

Server提供了一种简化并自动维护数据库的工具。这个称之为数据库维护计划向导(Database

Maintenance

Plan

Wizard

,DMPW)的工具也包括了对索引的优化。如果你运行这个向导,你会看到关于数据库中关于索引的统计量,这些统计量作为日志工作并定时更新,这样就减轻了手工重建索引或者DBCC

INDEXDEFRAG所带来的工作量。如果你不想自动定期刷新索引统计量,你还可以在DMPW中选择重新组织数据和数据页,这将停止旧有索引并按特定的填充因子重建索引。

2

改善硬件(双CPU,Raid

5,增加内存)

tempdb这个临时数据库,它对性能的影响较大。tempdb和其他数据库一样可以增大,可以缩小。当数据文件需要增长的时候,通常不能保持剩余部分的连续性。这时文件就会产生碎片,这种碎片会造成性能下降。这种碎片属于外来性碎片。要阻止在tempdb中产生外来性碎片,必须保证有足够的硬盘空间。一般将tempdb的容量放到平均使用容量。而你也应该允许tempdb自动增长,比如你有个一个超大的join *** 作,它建立了一个超过tempdb容量的时候,该查询将失败。你还要设置一个合理的单位增长量。因为如果你设得太小,将会产生许多外来性碎片,反而会占用更多资源。sqlserver调优最有效的做法之一,就是把争夺资源的 *** 作独立出去。tempdb就是一个需要独立出去的部分而tempdb和其他系统库一样是公用的,是存取最可能频繁的库,所有处理临时表、子查询、GROUP

BY、排序、DISTINCT、连接等等。它最适合放到一个具有快速读写能力的设备上。比如RAID0卷或RAID0+1卷上。

查询语句一定要使用存储过程;

3、查询尽量使用TOP子句

4将表按一定的约束分成子表,(如按分类)创建约束,在用Like

时,先用分类

and

like

,

应该可能解决问题

而且效果立秆见影!(你要确定SQL会认识你建的分区视图)我一个表有上百万的记录(700兆),用分区视图后,查询速度基本跟10万行一样

如果还是太慢,还可以考滤分布式分区视图!这总可以解决问题了吧!

关键在于你能否把大表按某种约束分解成子表

你的数据库是什么数据库?如果是ACCESS,建议你导入到MySQL中去,MySQL据说是世界上执行速度最快的数据库了,如果是MSSQL,请使用存储过程执行查询,可以大提高数据库的运行速度。你的问题我曾经碰到过,当时我使用的是ACCESS数据库,数据库中的数据达到20万条记录了,查询起来速度特慢,后来改用MSSQL的存储过程,速度提高了很多,你试试吧,祝你成功!

以上就是关于提高mysql查询效率的方法有哪些全部的内容,包括:提高mysql查询效率的方法有哪些、提高数据库的性能、数据库表数据量大怎么优化查询速度等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9878754.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存