MYSQL编程:利用索引的误区之三:基于函数的索引
要想在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的最“好”与最“不好”的功能之间没有明显的分界线,但它们组合在一起就形成了一副让我们欣赏的作品。 入门没那么困难,精通没那么容易 varchar(max)\\\\nvarchar(max)类型的引入大大的提高了编程的效率,可以使用字符串函数对CLOB类型进行操作,这是一个亮点。 比如,MicrosoftSQLServer2008的某一个版本可以满足现在的这个业务的需要,而且价格还比Oracle11g要便宜,那么这一产品就是适合的。 两个月啃那本sqlserver2005技术内部-存储引擎,花了几个月啃四本书 原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜! 从项目平台的选择上讲,我们关心的,应该是一款产品能不能满足任务需求,而不是网上怎么说。 对递归类的树遍历很有帮助。个人感觉这个真是太棒了!阅读清晰,非常有时代感。 总感觉自己还是不会SQL
页:
[1]