提高数据库查询效率的方法,如何通过优化sql语句提高数据库查询效率?

提高数据库查询效率的方法,如何通过优化sql语句提高数据库查询效率?

通过SQL调优提高查询性能最重要的就是对索引的使用,下面是对索引使用的一些总结,希望对你有所帮助。

MySQL索引对数据检索的性能至关重要,盲目的增加索引不仅不能带来性能的提升,反而会消耗更多的额外资源。

索引是用于快速查找记录的一种数据结构。索引就像是数据库中数据的目录,数据库在查询时,首先在索引中找到匹配的值,然后根据这个匹配值找到对应的数据行。

聚簇索引的顺序就是数据的物理存储顺序,索引中数据域存储的就是实际的数据,一个表最多只能有一个聚簇索引,适用于查询多行数据,不适用于频繁修改的列,一般在主键上创建。

非聚簇索引顺序与数据物理排列顺序无关,索引中存储的内容为实际数据的地址,适应于查询单行数据。

普通索引,即平时创建的普通索引。

唯一索引,索引所在的列或列组合的值是全表唯一的。

全文索引,MySQL从3.23.23版开始支持全文索引,它查找的是文中的关键词,而不是直接比较索引中的值。

单列索引,在单列上创建的索引。

组合索引,在多个列上创建的索引。

最左前缀查找:where子句中有a、b、c三个查询条件,创建一个组合索引abc(a,b,c),最左前缀的概念是说以组合索引最左边的列a组合成的查询条件,如(a,b,c)、(a,b)、(a,c),这三种情况的查询条件都会使用abc索引,和where子句中a、b、c出现的顺序没关系,可以是where c=? and b=? and a=?,但(b,c)组合不会使用索引,即where c=? and b=?。

哪些列适合创建索引:

1.经常作为查询条件的列;

2.经常作为排序条件的列;

3.经常作为join条件的列;

4.经常被查询的列。

哪些列不适合创建索引:

1.数据频繁被修改的列,数据被修改,索引需要做相应的修改,消耗资源; 2.区分度不是很高的列,如性别,列值重复性太大,索引效果不是很明显; 3.不是经常被作为查询条件、排序条件、连接条件的列。

经验总结:

1.列上进行函数计算将不会使用索引;

2.对于创建索引的列,避免存储NULL,NULL会使索引更加复杂、效率变低,可以使用NOT NULL进行约束;

3.对于模糊查询like '%abc%',将不会使用索引,而like 'abc%'将会使用索引;

4.对于not in、not exists、!=等负向查询将不会使用索引;

5.每次查询只使用一个索引,如果where条件使用了索引,order by将不再使用索引;

6.对于where子句中有多个查询条件的,单列索引的效率不如复合索引,因为查询每次只能使用一个索引;

7.MySQL只对以下操作符才使用索引:<、、>=、between、in,但是需要注意in的范围值不要太多;

8.union all可以使用索引,但本身效率不是很高,不建议使用;

9.列上进行类型转换的将不会使用索引;

10.老版本MySQL对OR条件不使用索引,新版本才支持,不建议使用OR。

关于索引的实战经验总结后续还会不断更新,可以关注我的号!

提高数据库查询效率的方法,如何通过优化sql语句提高数据库查询效率?

sql 2000数据库置疑的解决方法?

备份数据文件,然后按下面的步骤处理:

1.新建一个同名的数据库(数据文件与原来的要一致)

2.再停掉sql server(注意不要分离数据库)

3.用原数据库的数据文件覆盖掉这个新建的数据库

4.再重启sql server

5.此时打开企业管理器时会出现置疑,先不管,执行下面的语句(注意修改其中的数据库名)

6.完成后一般就可以访问数据库中的数据了,这时,数据库本身一般还要问题,解决办法是,利用

数据库的脚本创建一个新的数据库,并将数据导进去就行了.

USE MASTER

GO

SP_CONFIGURE 'ALLOW UPDATES',1 RECONFIGURE WITH OVERRIDE

GO

UPDATE SYSDATABASES SET STATUS =32768 WHERE NAME='置疑的数据库名'

Go

sp_dboption '置疑的数据库名', 'single user', 'true'

Go

DBCC CHECKDB('置疑的数据库名')

Go

update sysdatabases set status =28 where name='置疑的数据库名'

Go

sp_configure 'allow updates', 0 reconfigure with override

Go

sp_dboption '置疑的数据库名', 'single user', 'false

假设数据库为TEST:

按以下步骤执行

A.设置数据库允许直接操作系统表。此操作可以在SQL Server Enterprise Manager里面选择数据库服务器,按右键,选择“属性”,在“服务器设置”页面中将“允许对系统目录直接修改”一项选中。也可以使用如下语句来实现。

use master

go

sp_configure 'allow updates',1

go

reconfigure with override

go

B.设置test为紧急修复模式

update sysdatabases set status=-32768 where dbid=DB_ID('test')

此时可以在SQL Server Enterprise Manager里面看到该数据库处于“只读置疑脱机紧急模式”可以看到数据库里面的表,但是仅仅有系统表

C.下面执行真正的恢复操作,重建数据库日志文件

dbcc rebuild_log('test','C:Program FilesMicrosoft SQL ServerMSSQLDatatest_log.ldf')

执行过程中,如果遇到下列提示信息:

服务器: 消息 5030,级别 16,状态 1,行 1

未能排它地锁定数据库以执行该操作。

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

说明您的其他程序正在使用该数据库,如果刚才您在F步骤中使用SQL Server Enterprise Manager打开了test库的系统表,那么退出SQL Server Enterprise Manager就可以了。

正确执行完成的提示应该类似于:

警告: 数据库 'test' 的日志已重建。已失去事务的一致性。应运行 DBCC CHECKDB 以验证物理一致性。将必须重置数据库选项,并且可能需要删除多余的日志文件。

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

此时打开在SQL Server Enterprise Manager里面会看到数据库的状态为“只供DBO使用”。此时可以访问数据库里面的用户表了。

D.验证数据库一致性(可省略)

dbcc checkdb('test')

一般执行结果如下:

CHECKDB 发现了 0 个分配错误和 0 个一致性错误(在数据库 'test' 中)。

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

E.设置数据库为正常状态

sp_dboption 'test','dbo use only','false'

如果没有出错,那么恭喜,现在就可以正常的使用恢复后的数据库啦。

F.最后一步,我们要将步骤E中设置的“允许对系统目录直接修改”一项恢复。因为平时直接操作系统表是一件比较危险的事情。当然,我们可以在SQL Server Enterprise Manager里面恢复,也可以使用如下语句完成

sp_configure 'allow updates',0

go

reconfigure with override

go

上面的语句操作步骤有点问题:

应该如下:

A.我们使用默认方式建立一个供恢复使用的数据库(如test)。可以在SQL Server Enterprise Manager里面建立。

B.停掉数据库服务器。

C.将刚才生成的数据库的日志文件test_log.ldf删除,用要恢复的数据库mdf文件覆盖刚才生成的数据库数据文件test_data.mdf。

D.启动数据库服务器。此时会看到数据库test的状态为“置疑”。这时候不能对此数据库进行任何操作。

E.设置数据库允许直接操作系统表。此操作可以在SQL Server Enterprise Manager里面选择数据库服务器,按右键,选择“属性”,在“服务器设置”页面中将“允许对系统目录直接修改”一项选中。也可以使用如下语句来实现。

use master

go

sp_configure 'allow updates',1

go

reconfigure with override

go

F.设置test为紧急修复模式

update sysdatabases set status=-32768 where dbid=DB_ID('test')

此时可以在SQL Server Enterprise Manager里面看到该数据库处于“只读置疑脱机紧急模式”可以看到数据库里面的表,但是仅仅有系统表

G.下面执行真正的恢复操作,重建数据库日志文件

dbcc rebuild_log('test','C:Program FilesMicrosoft SQL ServerMSSQLDatatest_log.ldf')

执行过程中,如果遇到下列提示信息:

服务器: 消息 5030,级别 16,状态 1,行 1

未能排它地锁定数据库以执行该操作。

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

说明您的其他程序正在使用该数据库,如果刚才您在F步骤中使用SQL Server Enterprise Manager打开了test库的系统表,那么退出SQL Server Enterprise Manager就可以了。

正确执行完成的提示应该类似于:

警告: 数据库 'test' 的日志已重建。已失去事务的一致性。应运行 DBCC CHECKDB 以验证物理一致性。将必须重置数据库选项,并且可能需要删除多余的日志文件。

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

此时打开在SQL Server Enterprise Manager里面会看到数据库的状态为“只供DBO使用”。此时可以访问数据库里面的用户表了。

H.验证数据库一致性(可省略)

dbcc checkdb('test')

一般执行结果如下:

CHECKDB 发现了 0 个分配错误和 0 个一致性错误(在数据库 'test' 中)。

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

I.设置数据库为正常状态

sp_dboption 'test','dbo use only','false'

如果没有出错,那么恭喜,现在就可以正常的使用恢复后的数据库啦。

J.最后一步,我们要将步骤E中设置的“允许对系统目录直接修改”一项恢复。因为平时直接操作系统表是一件比较危险的事情。当然,我们可以在SQL Server Enterprise Manager里面恢复,也可以使用如下语句完成

sp_configure 'allow updates',0

go

reconfigure with override

go

"

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

发表评论

登录后才能评论