mysql中大数据进行查询优化注意什么
mysql中大数据查询优化的注意:1、对查询进行优化,应尽量以免全表扫描;2、应尽量以免在where子句中对字段进行null值推断;3、in和not in也要慎用;4、应尽量以免在where子句中运用or来连;5、尽量以免运用游标。
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=10 union 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=@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 name like ‘abc%’
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.尽量以免向客户端返回大数据量,若数据量过大,应当考虑响应需求可否合理。
更多相干免费学习举荐:mysql教程(视频)
以上就是mysql中大数据进行查询优化注意什么的细致内容,更多请关注 百分百源码网 其它相干文章!