原因就是执行计划没有很好的使用连接条件,结果A和B表做了笛卡尔及。
然后HASH完了再做的过滤。那肯定慢啊。HASH超过了HASR_AREA_SIZE的大小,使用TEMPSPACE那肯定慢了。
2M啊
MYSQL在创建索引后对索引的使用方式分为两种:\x0d\1 由数据库的查询优化器自动判断是否使用索引;\x0d\2 用户可在写SQL语句时强制使用索引\x0d\\x0d\下面就两种索引使用方式进行说明\x0d\第一种,自动使用索引。数据库在收到查询语句后会查看where语句后面的查询条件,同时查看在表上面有哪些索引,然后根据查询条件和索引进行匹配。\x0d\查询条件和索引的匹配包括查询字段与索引字段的匹配和查询类型和索引类型的匹配。前者很好理解,就是查询条件的属性上要建有索引,后者则是说查询条件必须能够使用索引,比如等值判断和范围查询可以使用B+树索引,而hash索引只能适用于等值判断。\x0d\在找到与查询条件匹配的索引后,就是进行代价估计来决定是否使用索引,代价估计主要根据要访问的就数量,一般来说如果通过索引访问的记录数量占全表记录数量15%以上,则不会使用索引而是使用全表扫描,因为此时使用索引的代价更大。在大多数情况下使用索引是会提高效率的。\x0d\经过优化器的判断,最终会决定是否使用索引\x0d\ \x0d\第二种,强制使用索引,主要是通过SQL语句实现的\x0d\select from table force index(PRI) limit 2;(强制使用主键)\x0d\select from table force index(ziduan1_index) limit 2;(强制使用索引"ziduan1_index")\x0d\select from table force index(PRI,ziduan1_index) limit 2;(强制使用索引"PRI和ziduan1_index")\x0d\也可以禁止索引的使用\x0d\select from table ignore index(PRI) limit 2;(禁止使用主键)\x0d\select from table ignore index(ziduan1_index) limit 2;(禁止使用索引"ziduan1_index")\x0d\select from table ignore index(PRI,ziduan1_index) limit 2;(禁止使用索引"PRI,ziduan1_index")
一、避免进行null判断
应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,这里最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据库。
备注、描述、评论之类的可以设置为 NULL,最好不要使用NULL。不要错误的认为NULL 不需要空间,如char(100) 型,在字段建立时,空间就固定了。不管是否插入值(NULL也包含在内),都是占用 100个字符的空间的,如果是varchar这样的变长字段, null 不占用空间。可以在num上设置默认值0,确保表中num列没有null值。
二、不要使用select
使用select 的话会增加解析的时间,另外也会把不需要的数据同时查询出来,从而延长数据传输时间,耗费精力。如text类型的字段,通常用来保存一些内容比较繁杂的东西,如果使用select ,则会把该字段也查询出来。
三、谨慎使用模糊查询
当模糊匹配以%开头时,该列索引将失效。若不以%开头,该列索引有效。
四、不要使用列号
使用列号的话,将会增加不必要的解析时间。
五、优先使用UNION ALL,避免使用UNION
因为UNION 会将各查询子集的记录做比较,故比起UNION ALL ,通常速度都会慢上许多。一般来说,如果使用UNION ALL能满足要求的话,务必使用UNION ALL。还有一种情况,如果业务上能够确保不会出现重复记录。
六、在where语句或者order by语句中避免对索引字段进行计算 *** 作
当在索引列上进行 *** 作之后,索引将会失效。正确做法应该是将值计算好再传入进来。
七、使用not exist代替not in
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。
八、exist和in的区别
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环
再对内表进行查询。因此,in用到的是外表的索引, exists用到的是内表的索引。如果查询的两个表大小相当,那么用in和exists差别不大。如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in。
九、避免在索引列上做如下 *** 作
1避免在索引列上使用IS NULL和IS NOT NULL。
2避免在索引列上出现数据类型转换。(比如某字段是String类型,参数传入时是int类型)当在索引列上使用如上 *** 作时,索引将会失效,造成全表扫描。
十、复杂 *** 作可以考虑适当拆成几步
有时候会有通过一个SQL语句来实现复杂业务的例子出现,为了实现复杂的业务,嵌套多级子查询。造成SQL性能问题。对于这种情况可以考虑拆分SQL,通过多个SQL语句实现,或者把部分程序能完成的工作交给程序完成。
索引是在存储引擎中实现的,也就是说不同的存储引擎,会使用不同的索引。MyISAM和InnoDB存储引擎:只支持BTREE索引,也就是说默认使用BTREE,不能够更换,MySQL57中InnoDB可以支持HASH索引;MEMORY/HEAP存储引擎:支持HASH和BTREE索引。索引可划分为单列索引(其中包括普通索引、唯一索引、主键索引)、组合索引、全文索引、空间索引,其中单列索引是一个索引只包含单个列,但一个表中可以有多个单列索引。
MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点。
索引列中的值必须是唯一的,但是允许为空值,
是一种特殊的唯一索引,不允许有空值。
在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合。
由id、name和age3个字段构成的索引,索引行中就按id/name/age的顺序存放,索引可以索引下面字段组合(id,name,age)、(id,name)或者(id)。如果要查询的字段不构成索引最左面的前缀,那么就不会是用索引,比如,age或者(name,age)组合就不会使用索引查询
全文索引,只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引。全文索引就是在一堆文字中,通过其中的某个关键字等,就能找到该字段所属的记录行,比如有"你是个大牛,神人 " 通过大牛,可能就可以找到该条记录。这里说的是可能,因为全文索引的使用涉及了很多细节,我们只需要知道这个大概意思。
只有在MyISAM引擎上才能使用,空间索引是对空间数据类型的字段建立的索引,MySQL中的空间数据类型有四种,GEOMETRY、POINT、LINESTRING、POLYGON。
在创建空间索引时,使用SPATIAL关键字。
创建空间索引的列,必须将其声明为NOT NULL。。
SPATIAL INDEX spatIdx(g)
全值匹配我最爱,最左前缀要遵守;
带头大哥不能死,中间兄弟不能断;
索引列上少计算,范围之后全失效;
Like百分写最右,覆盖索引不写星;
不等空值还有or,索引失效要少用;
VAR引号不可丢,SQL高级也不难!
参考: <u>>
以上就是关于如何优化 hash join oracle全部的内容,包括:如何优化 hash join oracle、mysql添加索引后在查询的时候是mysql自动从索引里面查询还是查询的时候有单独的参数查询索引、大数据干货:SQL优化方案精解十则等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)