30种mysql优化sql语句查询的方法
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0
4.应尽量避免在 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
5.下面的查询也将导致全表扫描:
select id from t where name like '%abc%'
若要提高效率,可以考虑全文检索。
6.in 和 not in 也要慎用,否则会导致全表扫描,如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
7.如果在 where 子句中使用参数,也会导致全表扫描。
因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。
然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。
如下面语句将进行全表扫描:
select id from t where num=@num
可以改为强制查询使用索引:
select id from t with(index(索引名)) where num=@num
8.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。
如:
select id from t where num/2=100
应改为:
select id from t where num=100*2
9.应尽量避免在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'
10.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
11.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
12.不要写一些没有意义的查询,如需要生成一个空表结构:
select col1,col2 into #t from t where 1=0
这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:
create table #t(...)
13.很多时候用 exists 代替 in 是一个好的选择:
select num from a where num in(select num from b)
用下面的语句替换:
select num from a where exists(select 1 from b where num=a.num)
14.并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。
15.索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。
一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
16.应尽可能的避免更新 clustered 索引数据列,因为 clustered 索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。
若应用系统需要频繁更新 clustered 索引数据列,那么需要考虑是否应将该索引建为 clustered 索引。
17.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。
这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
18.尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
19.任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
20.尽量使用表变量来代替临时表。
如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。
21.避免频繁创建和删除临时表,以减少系统表资源的消耗。
22.临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。
但是,对于一次性事件,最好使用导出表。
23.在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。
24.如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。
25.尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。
26.使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效。
27.与临时表一样,游标并不是不可使用。
对小型数据集使用 FAST_FORWARD 游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时。
在结果集中包括“合计”的例程通常要比使用游标执行的速度快。
如果开发时间允许,基于游标的方法和基于集的方法都可以尝试一下,看哪一种方法的效果更好。
28.在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF 。
无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。
29.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。
30.尽量避免大事务操作,提高系统并发能力。
sql查询语句优化方法
sql查询语句优化方法SQL查询语句的优化是提高数据库性能的关键。
以下是一些常见的SQL查询优化方法:1. 使用索引:为经常查询的列和WHERE子句中的条件列建立索引。
考虑使用复合索引,但要注意复合索引的列顺序。
避免全表扫描,尽量使用索引查找。
2. 避免SELECT :只选择需要的列,避免SELECT 。
3. 使用连接(JOIN)代替子查询:当可能时,使用连接代替子查询来提高效率。
4. 优化WHERE子句:避免在WHERE子句中使用函数,这会导致函数在每一行上都执行一次,可能导致全表扫描。
尽量避免使用“IN”和“OR”子句。
5. 使用EXPLAIN:使用EXPLAIN关键字来查看查询的执行计划,从而找到性能瓶颈。
6. 优化JOIN操作:尽量减少JOIN的数量。
确保JOIN的字段已经被索引。
7. 使用合适的数据类型:为字段选择合适的数据类型可以减少存储需求并提高查询性能。
8. 减少使用LIKE操作符:当使用LIKE操作符时,尽量避免通配符开头的查询,如'%xyz'。
这样的查询不能有效地使用索引。
9. 优化排序操作:尽量减少排序操作,尤其是在大数据集上。
如果必须排序,考虑使用索引来加速排序过程。
10. 优化存储引擎:根据需要选择合适的存储引擎,如InnoDB或MyISAM。
11. 定期进行数据库维护:如优化表(`OPTIMIZE TABLE`),修复表(`REPAIR TABLE`)等。
12. 考虑分区:对于非常大的表,可以考虑使用分区来提高查询性能。
13. 缓存查询结果:在适当的情况下,缓存频繁查询的结果可以避免重复计算。
14. 使用数据库的查询缓存:如果数据库支持(如MySQL),开启查询缓存可以提高重复查询的性能。
15. 优化数据库设计:正规化数据库设计以减少数据冗余,同时考虑性能需求进行适当的反规范化。
16. 合理设计数据库规模和硬件配置:根据应用需求合理设计数据库规模,并考虑硬件配置对性能的影响。
MySQLSQL语句分析查询优化
MySQLSQL语句分析查询优化如何获取有性能问题的SQL1、通过⽤户反馈获取存在性能问题的SQL2、通过慢查询⽇志获取性能问题的SQL3、实时获取存在性能问题的SQL使⽤慢查询⽇志获取有性能问题的SQL⾸先介绍下慢查询相关的参数1、slow_query_log 启动定制记录慢查询⽇志设置的⽅法,可以通过MySQL命令⾏设置set global slow_query_log=on或者修改/etc/f⽂件,添加slow_query_log=on2、slow_query_log_file 指定慢查询⽇志的存储路径及⽂件建议⽇志存储和数据存储分开存储3、long_query_time 指定记录慢查询⽇志SQL执⾏时间的阈值①记录所有符合条件的SQL②数据修改语句③包括查询语句④已经回滚的SQL注意:时间可以精确到微秒,存储的单位是秒,默认值为10秒,例如我们想查询1微秒的值,这⾥就要设置成0.001秒4、log_queries_not_using_indexes 是否记录未使⽤索引的SQL5、log_output 设置慢⽇志查询的保存格式(如果需要保存为⽂件请修改成FILE)慢查询使⽤⽇志中记录的信息1、第⼀⾏记录的信息为使⽤sbtest做的测试2、第⼆⾏记录的信息为慢查询⽇志的时间3、第三⾏记录的信息为所使⽤锁的时间4、第四⾏记录的信息为返回的数据⾏数5、第五⾏记录的信息为扫描数据的⾏数6、第六⾏记录的信息为时间戳7、第七⾏记录的信息为查询的SQL语句使⽤慢查询获取有性能问题的SQL常使⽤的慢查询⽇志分析⼯具(mysqldumpslow)介绍:汇总除查询条件外其他完全相同的SQL,并将分析结果按照参数中所指定的顺序输出慢查询⽇志实例慢查询的相关配置设置命令⾏执⾏参数查看分析的结果]# cd /var/lib/mysql/log]# mysqldumpslow -s r -t 10 slow-mysql常使⽤的慢查询⽇志分析⼯具(pt-query-digest)使⽤⼯具前,需要先安装该⼯具,如果已有,可略过下⾯的安装步骤1、perl模块]# yum install -y perl-CPAN perl-Time-HiRes perl-IO-Socket-SSL perl-DBD-mysql perl-Digest-MD52、切换⾄src⽬录下载rpm包]# cd /usr/local/src]# wget https:///downloads/percona-toolkit/3.0.7/binary/redhat/7/x86_64/percona-toolkit-3.0.7-1.el7.x86_64.rpm 3、安装⼯具包]# rpm -ivh percona-toolkit-3.0.7-1.el7.x86_64.rpm执⾏命令分析慢查询⽇志]# pt-query-digest --user=root --password=redhat --host=127.0.0.1 slow-mysql > slow.rep分析的结果如下MySQL服务器处理查询请求的整个过程1、客户端发送SQL请求给服务器2、服务器检查是否存在在缓存服务器中命中该SQL3、服务器端进⾏SQL解析,预处理,再由优化器对应执⾏计划4、根据执⾏计划,调⽤存储引擎API来查询数据5、将结果返回给客户端查询缓存对SQL性能的影响1、优先检查整个查询是否命中查询缓存中的数据2、通过⼀个对⼤⼩写敏感的哈希查找实现的查询缓存的优化参数query_cache_type 设置查询缓存是否可⽤ON,OFF,DEMAND注意:DEMAND表⽰只有在查询语句中使⽤SQL——CACHE和SQL_NO_CACHE来控制是否需要缓存query_cache_size 设置查询缓存的内存⼤⼩query_cache_limit 设置查询缓存可⽤存储的最⼤值query_cache_wlock_invalidate 设置数据表被锁后是否返回缓存中的数据(默认是关闭的,建议也是关闭的此选项)query_cache_min_res_unit 设置查询缓存分配的内存块最⼩的值会造成MySQL⽣成错误的执⾏计划的原因1、统计信息不准确2、执⾏计划中的成本估算不等同于实际的执⾏计划的成本3、MySQL优化器所认为的最优可能与你所认为的最优不⼀样4、MySQL从不考虑其他并发的查询,这可能会影响当前查询数据5、MySQL有时候也会基于⼀些固定的规则来⽣成执⾏计划6、MySQL不会考虑不受其控制的成本MySQL优化器可优化的SQL类型1、重新定义表的关联顺序优化器会根据统计信息来决定表的关联顺序2、将外链接转换成内连接where条件和库表结构等3、使⽤等价变换规则(5=5 and a > 5)将会被改写成 a > 54、优化count(), min()和max()select tables optimized away优化器已经从执⾏计划中移除了该表,并以⼀个常数取⽽代之5、将⼀个表达式转换为常数表达式6、使⽤等价变换规则7、⼦查询优化8、对in()条件进⾏优化如何确定查询处理各个阶段所消耗的时间使⽤profileset profiling = 1;执⾏查询:show profiles;show profile for query N;查询的每个阶段所消耗的时间使⽤profile查看语句所消耗的时间特定的SQL查询优化1、利⽤主从切换的原理进⾏⼤表的表结构修改,例如,现在从服务器上修改,修改完毕以后,进⾏主从切换,再在原来⽼的主上进⾏⼤表的修改,存在⼀定的风险。
如何在MySQL中追踪和调试SQL语句执行过程
如何在MySQL中追踪和调试SQL语句执行过程引言MySQL是一种常用的关系型数据库管理系统,广泛应用于各类应用程序开发中。
在开发过程中,我们经常需要对SQL语句进行调试和优化,以提高查询性能和减少潜在的问题。
本文将介绍如何在MySQL中追踪和调试SQL语句执行过程的方法。
一、MySQL查询执行过程概述在深入了解如何追踪和调试SQL语句之前,我们先来了解一下MySQL查询执行的基本过程。
当我们执行一条SQL语句时,MySQL会经历以下几个主要阶段:1. 语法解析和语义检查:MySQL首先对SQL语句进行解析,并进行语法和语义检查,确保语句的正确性和合法性。
2. 查询优化:MySQL会根据查询的复杂性、表的结构以及索引等因素,选择最优的执行计划。
优化的目标是尽可能减少磁盘I/O操作和CPU计算,提高查询性能。
3. 执行计划生成和执行:MySQL会生成执行计划,决定如何访问和处理相关表中的数据。
然后,MySQL根据执行计划执行查询,并返回结果。
二、追踪SQL语句执行过程的方法在开发和调试过程中,我们通常需要了解SQL语句是如何被执行的,以便发现潜在的问题和优化查询性能。
下面介绍几种在MySQL中追踪SQL语句执行过程的方法:1. EXPLAIN命令:EXPLAIN命令是MySQL提供的一个非常有用的工具,用于分析查询语句的执行计划。
我们可以通过执行"EXPLAIN SELECT * FROMtable_name"来查看执行计划,并了解MySQL是如何执行查询的。
执行EXPLAIN命令后,MySQL会返回一个包含详细执行计划的结果集。
这些信息包括所使用的索引、表的读取方式、数据的访问顺序等。
通过分析执行计划,我们可以判断查询是否进行了索引扫描、是否存在全表扫描等问题,从而优化查询。
2. 慢查询日志:MySQL的慢查询日志是记录执行时间超过一定阈值的SQL语句的日志。
我们可以通过设置"slow_query_log"参数启用慢查询日志,并设置"long_query_time"参数指定执行时间的阈值。
sql语句优化方法详解
sql语句优化方法详解
SQL优化可以分成两大部分:
1、结构优化:指优化SQL语句的构造、结构,提高语句的可读性,以及确保SQL语句的正确性、有效性。
- 合理使用SQL关键字及条件:要尽量使用SQL的关键字,如select distinct,where等等,以降低执行成本。
-避免全表扫描:只要有可能,尽量避免使用全表扫描,如果实在无法避免可以考虑建立相应索引。
-合理使用连接:尽量使用连接,但也要注意其执行成本,不要连接过多的表,增加额外执行的成本。
-优化查询条件:尽量使用准确的条件,条件要最小化,比如使用准确的日期条件。
2、性能优化:指通过对SQL执行计划进行优化,提高SQL语句的效率,从而降低资源的消耗。
-合理使用索引:要尽量合理的使用索引,如果没有合理的索引,就会对数据库没有任何帮助,反而加重数据库的负担。
-合理建立存储过程:应尽量把相似的SQL语句放到存储过程中,以便复用。
-将复杂的SQL语句拆成多个语句:可以通过对复杂的SQL语句进行拆分,将多个子语句分别执行,然后再将其结果进行合并,这样可以大大减少SQL执行次数,提高SQL的性能。
-使用EXPLAINEXTENDED:用EXPLAINEXTENDED帮助可以发现一些性能瓶颈,从而指导优化SQL语句,提高SQL性能。
MySQL巧用sum、case和when优化统计查询
MySQL巧⽤sum、case和when优化统计查询最近在公司做项⽬,涉及到开发统计报表相关的任务,由于数据量相对较多,之前写的查询语句查询五⼗万条数据⼤概需要⼗秒左右的样⼦,后来经过⽼⼤的指点利⽤sum,case...when...重写SQL性能⼀下⼦提⾼到⼀秒钟就解决了。
这⾥为了简洁明了的阐述问题和解决的⽅法,我简化⼀下需求模型。
现在数据库有⼀张订单表(经过简化的中间表),表结构如下:CREATE TABLE `statistic_order` (`oid` bigint(20) NOT NULL,`o_source` varchar(25) DEFAULT NULL COMMENT '来源编号',`o_actno` varchar(30) DEFAULT NULL COMMENT '活动编号',`o_actname` varchar(100) DEFAULT NULL COMMENT '参与活动名称',`o_n_channel` int(2) DEFAULT NULL COMMENT '商城平台',`o_clue` varchar(25) DEFAULT NULL COMMENT '线索分类',`o_star_level` varchar(25) DEFAULT NULL COMMENT '订单星级',`o_saledep` varchar(30) DEFAULT NULL COMMENT '营销部',`o_style` varchar(30) DEFAULT NULL COMMENT '车型',`o_status` int(2) DEFAULT NULL COMMENT '订单状态',`syctime_day` varchar(15) DEFAULT NULL COMMENT '按天格式化⽇期',PRIMARY KEY (`oid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8项⽬需求是这样的:统计某段时间范围内每天的来源编号数量,其中来源编号对应数据表中的o_source字段,字段值可能为CDE,SDE,PDE,CSE,SSE。
MySQL SQL语句优化的常用技巧和方法
MySQL SQL语句优化的常用技巧和方法MySQL是一种广泛应用于互联网和企业级应用的开源关系型数据库管理系统,其性能优化一直以来都是开发者和数据库管理员关注和研究的重点。
在数据库应用过程中,SQL语句的优化是提高系统性能的关键因素之一。
本文将介绍MySQL SQL语句优化的常用技巧和方法,希望能为读者提供一些有用的参考。
1. 使用适当的索引索引是优化SQL语句查询性能的一种重要手段。
在设计数据库表时,根据查询需求合理创建索引,能够加快数据检索的速度。
常见的索引类型有主键索引、唯一索引、普通索引等。
在选择索引列时,应当考虑列经常被用作查询的条件,同时还需要控制创建索引的数量,过多的索引会降低数据库的性能。
2. 避免全表扫描全表扫描是指无法利用索引,而需要遍历整个表的操作。
对于大表而言,全表扫描的时间开销是非常大的。
因此,在编写SQL语句时,应尽量避免使用不带索引的列作为查询条件,或者通过合适的方式创建索引来规避全表扫描。
3. 合理使用JOIN操作多表查询是数据库应用中常见的操作之一,JOIN操作可以将多个相关联的表连接起来。
在进行JOIN操作时,应当根据业务需求和数据分布情况,选择合适的JOIN算法。
常见的JOIN算法有嵌套循环连接、哈希连接和排序合并连接等。
选择适当的JOIN算法,可以减少查询的时间复杂度,提高查询性能。
4. 避免使用SELECT *在编写SELECT语句时,应尽量避免使用SELECT *的写法。
SELECT *会查询表中的所有列,无论这些列是否真正被用到,这样会增加数据库的负载。
应该明确指定需要查询的列,减少不必要的数据传输和计算,提高查询效率。
5. 使用EXPLAIN分析查询语句使用EXPLAIN关键字可以分析查询语句的执行计划,了解查询过程中涉及的表、索引、连接方式等信息。
通过分析EXPLAIN结果,可以发现潜在的性能问题,并进行相应的优化。
例如,可以根据EXPLAIN结果来判断是否需要创建索引,是否需要重构查询语句等。
mysql-优化-千万级数据SQL查询优化
提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)1、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null;可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num=0;3、应尽量避免在 where 子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。
4、应尽量避免在 where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num=10 or num=20;可以这样查询:select id from t where num=10union all select id from t where num=20;5、in 和 not in 也要慎用,否则会导致全表扫描,如:select id from t where num in(1,2,3);对于连续的数值,能用 between 就不要用 in:select id from t where num between 1 and 3;6、下面的查询也将导致全表扫描:select id from t where name like '李%'若要提高效率,可以考虑全文检索。
7、如果在 where 子句中使用参数,也会导致全表扫描。
因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。
然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。
如下面语句将进行全表扫描:select id from t where num=@num可以改为强制查询使用索引:select id from t with(index(索引名)) where num=@num8、应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。
SQL优化的几种方法及总结
SQL优化的⼏种⽅法及总结优化⼤纲:通过explain 语句帮助选择更好的索引和写出更优化的查询语句。
SQL语句中的IN包含的值不应该过多。
当只需要⼀条数据的时候,使⽤limit 1。
如果限制条件中其他字段没有索引,尽量少⽤or。
尽量⽤union all代替union。
不使⽤ORDER BY RAND()。
区分in和exists、not in和not exists。
使⽤合理的分页⽅式以提⾼分页的效率。
查询的数据过⼤,可以考虑使⽤分段来进⾏查询。
避免在where⼦句中对字段进⾏null值判断。
避免在where⼦句中对字段进⾏表达式操作。
必要时可以使⽤force index来强制查询⾛某个索引。
注意查询范围,between、>、<等条件会造成后⾯的索引字段失效。
关于JOIN优化。
优化使⽤1、mysql explane ⽤法 explane显⽰了mysql如何使⽤索引来处理select语句以及连接表。
可以帮助更好的索引和写出更优化的查询语句。
EXPLAIN SELECT*FROM l_line WHERE `status` =1and create_at >'2019-04-11';explain字段列说明table:显⽰这⼀⾏的数据是关于哪张表的type:这是重要的列,显⽰连接使⽤了何种类型。
从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和allpossible_keys:显⽰可能应⽤在这张表中的索引。
如果为空,没有可能的索引。
可以为相关的域从where语句中选择⼀个合适的语句key:实际使⽤的索引。
如果为null,则没有使⽤索引。
很少的情况下,mysql会选择优化不⾜的索引。
这种情况下,可以在select语句中使⽤use index(indexname)来强制使⽤⼀个索引或者⽤ignore index(indexname)来强制mysql忽略索引key_len:使⽤的索引的长度。
mysql查询优化,提高MYSQL性能的方法
mysql查询优化,提高MYSQL性能的方法MySQL查询优化技术MySQL查询优化系列讲座之数据类型与效率在可以使用短数据列的时候就不要用长的。
如果你有一个固定长度的CHAR数据列,那么就不要让它的长度超出实际需要。
如果你在数据列中存储的最长的值有40个字符,就不要定义成CHAR(255),而应该定义成CHAR(40)。
如果你能够用MEDIUMINT代替BIGINT,那么你的数据表就小一些(磁盘I/O少一些),在计算过程中,值的处理速度也快一些。
如果数据列被索引了,那么使用较短的值带来的性能提高更加显著。
不仅索引可以提高查询速度,而且短的索引值也比长的索引值处理起来要快一些。
如果你可以选择数据行的存储格式,那么应该使用最适合存储引擎的那种。
对于MyISAM数据表,最好使用固定长度的数据列代替可变长度的数据列。
例如,让所有的字符列用CHAR类型代替VARCHAR类型。
权衡得失,我们会发现数据表使用了更多的磁盘空间,但是如果你能够提供额外的空间,那么固定长度的数据行被处理的速度比可变长度的数据行要快一些。
对于那些被频繁修改的表来说,这一点尤其突出,因为在那些情况下,性能更容易受到磁盘碎片的影响。
·在使用可变长度的数据行的时候,由于记录长度不同,在多次执行删除和更新操作之后,数据表的碎片要多一些。
你必须使用OPTIMIZE TABLE来定期维护其性能。
固定长度的数据行没有这个问题。
·如果出现数据表崩溃的情况,那么数据行长度固定的表更容易重新构造。
使用固定长度数据行的时候,每个记录的开始位置都可以被检测到,因为这些位置都是固定记录长度的倍数,但是使用可变长度数据行的时候就不一定了。
这不是与查询处理的性能相关的问题,但是它一定能够加快数据表的修复速度。
实战应用:uchome 的cleannotification.php计划任务脚本//清理通知$deltime = $_SGLOBAL['timestamp'] - 2*3600*24;//只保留2天//执行$_SGLOBAL['db']->query("DELETE FROM ".tname('notification')." WHERE dateline < '$deltime' AND new='0'");$_SGLOBAL['db']->query("OPTIMIZE TABLE ".tname('notification'), 'SILENT');//优化表尽管把MyISAM数据表转换成使用固定长度的数据列可以提高性能,但是你首先需要考虑下面一些问题:·固定长度的数据列速度较快,但是占用的空间也较大。
SQL优化查询速度的方法
SQL优化查询速度的方法
1、优化SQL语句:
(1)改善SQL语句的语法和逻辑结构
SQL语法的效率取决于SQL的结构,要想提高SQL的查询结果,需要
有良好的结构来表达,常见的结构如下:
(1)尽可能使用join操作,而不是使用函数,比如使用inner
join或outer join替代union all或sub queries;
(2)优化where子句,尽量将where中的查询条件尽量细化,以提
高查询速度;
(3)尽量使用到sql的索引功能,使用合适的索引可以大大提高
sql语句的执行效率;
(4)考虑使用exists和not exists代替in和not in,因为in和not in只能执行单表查询,而exists和not exists可以实现多表查询,提高查询效率;
(5)尽量避免使用order by和group by,它们会对结果集进行排
序和分组,浪费大量时间;
(6)尽量避免使用like操作符,因为它会导致索引失效。
(2)利用缓存技术优化查询
缓存技术是指将查询条件放在缓存中,根据缓存的内容来提高查询速度。
在同一个环境中,如果时间跨度较长,可以考虑使用缓存技术,以提
高查询速度。
(3)优化sql语句的执行计划
sql语句的执行计划是指sql语句经过编译后,数据库系统根据具体的sql语句结构和条件给出的执行计划,优化sql语句的执行计划则指在sql语句的结构和条件不变的前提下。
