|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
要想在MySQL与其他数据库之间进行一个面面俱到的功能设置对比,并不是一件容易的MySQL学习教程。随着新软件版本的发布或一些补丁的推出。函数|索引利用索引的误区之三:基于函数的索引
利用基于函数的索引(BFI,BasedFunctionIndex):
从Oracle8i入手下手,可使用基于函数的索引来进步查询功能,
利用基于函数的索引,必要几个前提:
1,用户必要有createindex大概createanyindex权限
2,用户必要有queryrewrite大概globalqueryrewirte权限
3,设置体系参数query_rewrite_enabled=TRUE
和query_rewrite_integrity=enforced
4,设置体系参数:COMPATIBLE=8.1.0.0.0大概更高
5,创立了BFI后,必要对表举行剖析
请看上面的例子:
起首,在没有创建函数索引的情形下,我们看到查询没有如我们想一想一样利用单列(dname)索引:
SQL>setautotracetraceonly
SQL>select*fromdeptwheresubstr(dname,1,5)=aaa;
未选定行
已用工夫:00:00:00.00
ExecutionPlan
----------------------------------------------------------
0SELECTSTATEMENTOptimizer=CHOOSE
10TABLEACCESS(FULL)OFDEPT
Statistics
----------------------------------------------------------
134recursivecalls
0dbblockgets
20consistentgets
0physicalreads
0redosize
323bytessentviaSQL*Nettoclient
372bytesreceivedviaSQL*Netfromclient
1SQL*Netroundtripsto/fromclient
2sorts(memory)
0sorts(disk)
0rowsprocessed
上面间接创建基于函数的索引,看看是不是查询是不是可使用我们创建的索引
SQL>createindexdept_id5ondept(substr(dname,1,5));
createindexdept_id5ondept(substr(dname,1,5))
*
ERROR位于第1行:
ORA-01031:权限不敷
已用工夫:00:00:00.00
SQL>setautotraceoff
SQL>colusernameformata10
SQL>colprivilegeformata20
SQL>selectusername,privilegefromuser_sys_privs;
USERNAMEPRIVILEGE
------------------------------
DEMOUNLIMITEDTABLESPACE
PUBLICSELECTANYTABLE
已用工夫:00:00:00.00
SQL>selectusername,granted_rolefromuser_role_privs;
USERNAMEGRANTED_ROLE
----------------------------------------
DEMOCONNECT
DEMORESOURCE
PUBLICPLUSTRACE
已用工夫:00:00:00.01
我们看到,固然用户有connect和resource脚色,可是仍旧没有创建函数索引的权限。
我们利用sysdba身份上岸,给demo用户授createanyindex和globalqueryrewrite权限:
SQL>connlunar/lunar@test1assysdba
已毗连。
SQL>grantcreateanyindextodemo;
受权乐成。
已用工夫:00:00:00.00
SQL>grantglobalqueryrewritetodemo;
受权乐成。
已用工夫:00:00:00.00
SQL>conndemo/demo@test1
已毗连。
SQL>selectusername,privilegefromuser_sys_privs;
USERNAMEPRIVILEGE
------------------------------
DEMOCREATEANYINDEX
DEMOGLOBALQUERYREWRITE
DEMOUNLIMITEDTABLESPACE
PUBLICSELECTANYTABLE
已用工夫:00:00:00.00
SQL>selectusername,granted_rolefromuser_role_privs;
USERNAMEGRANTED_ROLE
----------------------------------------
DEMOCONNECT
DEMORESOURCE
PUBLICPLUSTRACE
已用工夫:00:00:00.00
再修正体系参数,将query_rewrite_enabled设置为true,这个参数是静态参数,设置后能够有吹糠见米的效果:
SQL>conn/@test1assysdba
已毗连。
SQL>showparameterquery
NAMETYPEVALUE
-----------------------------------------------------------------------------
query_rewrite_enabledstringFALSE
query_rewrite_integritystringenforced
SQL>altersystemsetquery_rewrite_enabled=true;
体系已变动。
已用工夫:00:00:00.00
SQL>showparameterquery
NAMETYPEVALUE
-----------------------------------------------------------------------------
query_rewrite_enabledstringTRUE
query_rewrite_integritystringenforced
好了,再利用demo用户上岸,创立函数索引
SQL>conndemo/demo@test1
已毗连。
SQL>createindexdept_id5ondept(substr(dname,1,5));
索引已创立。
已用工夫:00:00:00.00
SQL>selectindex_type,index_namefromuser_indexeswheretable_name=DEPT;
INDEX_TYPEINDEX_NAME
---------------------------------------------------------
FUNCTION-BASEDNORMALDEPT_ID5
已用工夫:00:00:00.00
可见已创立乐成了。
上面,我们看看查询是不是会利用我们创立的函数索引:
SQL>setautotracetraceonly
SQL>select*fromdeptwheresubstr(dname,1,5)=aaa;
未选定行
已用工夫:00:00:00.00
ExecutionPlan
----------------------------------------------------------
0SELECTSTATEMENTOptimizer=CHOOSE
10TABLEACCESS(FULL)OFDEPT
Statistics
----------------------------------------------------------
29recursivecalls
0dbblockgets
10consistentgets
0physicalreads
0redosize
323bytessentviaSQL*Nettoclient
372bytesreceivedviaSQL*Netfromclient
1SQL*Netroundtripsto/fromclient
0sorts(memory)
0sorts(disk)
0rowsprocessed
在我们剖析表以后,我们看到,查询如我们所但愿的那样,利用了索引。
SQL>analyzetabledeptcomputestatistics
2fortable
3forallindexes
4forallindexedcolumns;
表已剖析。
已用工夫:00:00:00.02
SQL>select*fromdeptwheresubstr(dname,1,5)=aaa;
未选定行
已用工夫:00:00:00.02
ExecutionPlan
----------------------------------------------------------
0SELECTSTATEMENTOptimizer=CHOOSE(Cost=2Card=1Bytes=23)
10TABLEACCESS(BYINDEXROWID)OFDEPT(Cost=2Card=1Byt
es=23)
21INDEX(RANGESCAN)OFDEPT_ID5(NON-UNIQUE)(Cost=1Ca
rd=1)
Statistics
----------------------------------------------------------
0recursivecalls
0dbblockgets
1consistentgets
0physicalreads
0redosize
323bytessentviaSQL*Nettoclient
372bytesreceivedviaSQL*Netfromclient
1SQL*Netroundtripsto/fromclient
0sorts(memory)
0sorts(disk)
0rowsprocessed
SQL>
经由过程一切的statistics,我们能够分明的看到,得当的利用索引会是功能进步几倍乃至更多。
MySQL的低成本来自于其简单性吗?它的普及性是由于其低成本吗?其实,在MySQL的最“好”与最“不好”的功能之间没有明显的分界线,但它们组合在一起就形成了一副让我们欣赏的作品。 |
|