sql视图建索引
⑴ sql表字段如何建立索引难道就是添加SQL查询语句
1、创建测试表,
create table test_index(id varchar2(20), v_date date);
⑵ 如何创建SqlServer视图的索引
这样一来,可从索引视图检索数据而无需重新编码,由此带来的高效率也使现有查询获益。在视图上创建的第一个索引必须是唯一聚集索引。在创建唯一聚集索引后,可创建其它非聚集索引。视图上的索引命名规则与表上的索引命名规则相同。唯一区别是表名由视图名替换。(Sql Server联机帮助)
语句:Create VIEW vXXX WITH SCHEMABINDING AS……
Create UNIQUE CLUSTERED INDEX idxXXX ON vXXX(cXXX)
一个标准视图转换为一个索引视图必须遵守以下规则:
A.视图必须使用With Schemabinding选项来创建;
如果创建视图时没有with Schemabinding,试图创建视图时就会报错:……因为该视图未绑定到架构
B.在这个视图中不能使用其他视图、导出表、行集函数或自查询,也就是说只能使用表;
C.视图所用到的基本表必须和视图属于同一个所有者;
D.视图只能链接同一个数据库中的表;
E.视图不能包含一个外部链接或自链接,也就是说在链接表时只能使用INNER JOIN并且INNER JOIN前后不能使同一个表,不能使用LEFT(RIGHT) JOIN 或者 LEFT (RIGHT) OUTER JOIN ;
F. 视图不能包含UNION子句、TOP子句、ORDER BY子句、Having子句、Rollup子句、Cube子句、compute子句、Compute By子句或Distinct关键字;
G. 视图不允许使用某些集合函数,如:Count(*)可以使用count_big(*)代替、avg()、max()、min()、stdev()、stdevp()、var()或varp()等;
H. 视图不能使用Select * 这样的语句,也就是说视图的所有字段都必须显示指定;
I. 视图不能包含Text、ntext、image类型的列;
J. 如果视图包含一个Group By子句,那么他必须在Select列中包含count_big(*);
K. 视图中的所有标和用户自定义的函数都必须使用两段式名来引用,即所有者.表或函数名称;
L. 所有的基本表和视图都必须使用 Set Ansi_Nulls On 创建;
M. 在创建索引时或创建索引后执行IUD时,必须显示或隐式地执行:
Set ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
SET ARITHABORT ON
SET CONCAT_NULL_YIELDS_NULL ON
SET QUOTED_IDENTIFIER ON
SET NUMERIC_ROUNDABORT OFF
各个选项的有关信息或意义,可以查阅SQL Server的联机丛书,这里就不再介绍了;
N. 索引视图只有在SQL Server2000的企业版或开发版或者更高的版本中才能创建。
⑶ Mysql建立索引经验
在实际开发中使用数据库时,难免会遇到一些大表数据,对这些数据进行查询时,有时候SQL会查询得特别慢,这时候,有经验的老师傅会告诉你,你看一下哪几个字段查的多,加一个索引就好了。
那么,怎么合理地建立索引呢?这里分享一下我的一些经验,如有不妥之处,欢迎批评指正。
1、不要盲目建立索引 , 先分析再创建
索引虽然能大幅度提升我们的查询性能,但也要知道,在你进行增删改时,索引树也要同样地进行维护。所以,索引不是越多越好,而是按需建立。最好是在一整块模块开发完成后,分析一下,去针对大多数的查询,建立联合索引。
2、使用联合索引尽量覆盖多的条件
这是说在一个慢sql里假如有五个where ,一个 order by ,那么我们的联合索引尽量覆盖到这五个查询条件,如果有必要,order by 也覆盖上 。
3、小基数字段不需要索引
这个意思是,如果一张表里某个字段的值只有那么几个,那么你针对这个字段建立的索引其实没什么意义,比如说,一个性别字段就两种结果,你建了索引,排序也没什么意思(也就是索引里把男女给分开了)
所以说,索引尽量选择基数大的数据去建立宴肆,能最大化地利用索引
4、长字符串可以使用前缀索引
我们建立索引的字段尽量选择字段类型知唤较小的,比如一个varchar(20)和varchar(256)的,我们在20的上晌猛轿面建立的索引和在256上就有明显的差距(字符串那么长排序也不好排呀,唉)。
当然,如果一定是要对varchar(256)建立索引,我们可以选择里面的前20个字符放在索引树里(这里的20不绝对,选择能尽量分辨数据的最小字符字段设计),类似这样KEY index(name(20),age,job) ,索引只会对name的前20个字符进行搜索,但前缀索引无法适用于order by 和 group by。
5、对排序字段设计索引的优先级低
如果一个SQL里我们出现了范围查找,后边又跟着一个排序字段,那么我们优先给范围查找的字段设置索引,而不是优先排序。
6、如果出现慢SQL,可以设计一个只针对该条SQL的联合索引。
不过慢SQL的优化,需要一步步去进行分析,可以先用explain查看SQL语句的分析结果,再针对结果去做相应的改进。explain的东西我们下次再讲。
PS:在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是 执行这条SQL。
⑷ 姹傝В锛屽叧浜岙QL缁栾〃鍒涘缓绱㈠紩鍜岃嗗浘镄勯梾棰桡纴钖勪綅甯甯蹇
绱㈠紩镄勪娇鐢ㄦ槸鏁版嵁搴撹嚜锷ㄥ畬鎴愮殑锛屼笉闇瑕佺壒鍒璋幂敤锛佷娇鐢ㄧ储寮曞彲浠ュ姞蹇镆ヨ㈤熷害锛屽彲浠ュ弬钥冧互涓嬬殑锏惧害锏剧戣存槑锛
浣跨敤绱㈠紩鍙蹇阃熻块梾琛ㄤ腑镄勭壒瀹氢俊鎭銆傜储寮曟槸瀵规暟鎹搴撹〃涓涓鍒楁垨澶氩垪镄勫艰繘琛屾帓搴忕殑涓绉岖粨鏋勶纴渚嫔 employee 琛ㄧ殑濮掳纸name锛夊垪銆傚傛灉瑕佹寜濮撴煡镓剧壒瀹氲亴锻桡纴涓庡繀椤绘悳绱㈣〃涓镄勬墍链夎岀浉姣旓纴绱㈠紩浼氩府锷╂偍镟村揩鍦拌幏寰楄ヤ俊鎭銆
銆銆鍦ㄥ叧绯绘暟鎹搴扑腑锛岀储寮曟槸涓绉崭笌琛ㄦ湁鍏崇殑鏁版嵁搴撶粨鏋勶纴瀹冨彲浠ヤ娇瀵瑰簲浜庤〃镄凷QL璇鍙ユ墽琛屽缑镟村揩銆傜储寮旷殑浣灭敤鐩稿綋浜庡浘涔︾殑鐩褰曪纴鍙浠ユ牴鎹鐩褰曚腑镄勯〉镰佸揩阃熸垒鍒版墍闇镄勫唴瀹广傚綋琛ㄤ腑链夊ぇ閲忚板綍镞讹纴鑻ヨ佸硅〃杩涜屾煡璇锛岀涓绉嶆悳绱淇℃伅鏂瑰纺鏄鍏ㄨ〃鎼灭储锛屾槸灏嗘墍链夎板綍涓涓鍙栧嚭锛屽拰镆ヨ㈡浔浠惰繘琛屼竴涓瀵规瘆锛岀劧钖庤繑锲炴弧瓒虫浔浠剁殑璁板綍锛岃繖镙峰仛浼氭秷钥楀ぇ閲忔暟鎹搴撶郴缁熸椂闂达纴骞堕犳垚澶ч噺纾佺洏I/O镎崭綔锛涚浜岀嶅氨鏄鍦ㄨ〃涓寤虹珛绱㈠紩锛岀劧钖庡湪绱㈠紩涓镓惧埌绗﹀悎镆ヨ㈡浔浠剁殑绱㈠紩鍊硷纴链钖庨氲繃淇濆瓨鍦ㄧ储寮曚腑镄凴OWID锛堢浉褰扑簬椤电爜锛夊揩阃熸垒鍒拌〃涓瀵瑰簲镄勮板綍銆
銆銆绱㈠紩鏄涓涓鍗旷嫭镄勚佺墿鐞嗙殑鏁版嵁搴撶粨鏋勶纴瀹冩槸镆愪釜琛ㄤ腑涓鍒楁垨鑻ュ共鍒楀肩殑闆嗗悎鍜岀浉搴旂殑鎸囧悜琛ㄤ腑鐗╃悊镙囱瘑杩欎簺鍊肩殑鏁版嵁椤电殑阃昏緫鎸囬拡娓呭崟銆
銆銆绱㈠紩鎻愪緵鎸囧悜瀛桦偍鍦ㄨ〃镄勬寚瀹氩垪涓镄勬暟鎹鍊肩殑鎸囬拡锛岀劧钖庢牴鎹鎭ㄦ寚瀹氱殑鎺掑簭椤哄簭瀵硅繖浜涙寚阍堟帓搴忋傛暟鎹搴扑娇鐢ㄧ储寮旷殑鏂瑰纺涓庢偍浣跨敤涔︾睄涓镄勭储寮旷殑鏂瑰纺寰堢浉浼硷细瀹冩悳绱㈢储寮曚互镓惧埌鐗瑰畾鍊硷纴铹跺悗椤烘寚阍堟垒鍒板寘钖璇ュ肩殑琛屻
銆銆鍦ㄦ暟鎹搴揿叧绯诲浘涓锛屾偍鍙浠ュ湪阃夊畾琛ㄧ殑钬灭储寮/阌钬濆睘镐ч〉涓鍒涘缓銆佺紪杈戞垨鍒犻櫎姣忎釜绱㈠紩绫诲瀷銆傚綋淇濆瓨绱㈠紩镓闄勫姞鍒扮殑琛锛屾垨淇濆瓨璇ヨ〃镓鍦ㄧ殑鍏崇郴锲炬椂锛岀储寮曞皢淇濆瓨鍦ㄦ暟鎹搴扑腑銆
涓鑸鏁版嵁搴揿湪寤虹珛镞剁殑榛樿ょ储寮曟槸涓婚敭锛屼絾鏄鍦ㄤ娇鐢ㄦ煡璇㈣繃绋嬩腑链変簺瀛楁靛线寰浣滀负缁忓父镄勬绱㈡浔浠讹纴姣旀柟璇村叆搴撴椂闂淬佸揿悕銆佺岖被绛夈傚傛灉涓嶅熀浜庝富阌镄勬煡璇㈢粡甯稿彂鐢熺殑璇濓纴鍦ㄨ繖浜涙煡璇㈠瓧娈典笂寤虹珛绱㈠紩鍙浠ュ姞蹇镆ヨ㈤熷害锛屾彁浜ょ▼搴忕殑鍙嶅簲镐ц兘锛
瀵逛簬瑙嗗浘锛屼竴涓鏄绠鍗曟柟渚挎煡璇锛屽悓镞朵篃鎻愰珮瀹夊叏镐э纴鍙鍙傝幂栌搴︾栌绉戜粙缁
銆銆* 绠鍗曟с傜湅鍒扮殑灏辨槸闇瑕佺殑銆傝嗗浘涓崭粎鍙浠ョ亩鍖栫敤鎴峰规暟鎹镄勭悊瑙o纴涔熷彲浠ョ亩鍖栦粬浠镄勬搷浣溿傞偅浜涜缁忓父浣跨敤镄勬煡璇㈠彲浠ヨ瀹氢箟涓鸿嗗浘锛屼粠钥屼娇寰楃敤鎴蜂笉蹇呬负浠ュ悗镄勬搷浣沧疮娆℃寚瀹氩叏閮ㄧ殑𨱒′欢銆
銆銆* 瀹夊叏镐с傞氲繃瑙嗗浘鐢ㄦ埛鍙鑳芥煡璇㈠拰淇鏀逛粬浠镓鑳借佸埌镄勬暟鎹銆傛暟鎹搴扑腑镄勫叾瀹冩暟鎹鍒欐棦鐪嬩笉瑙佷篃鍙栦笉鍒般傛暟鎹搴撴巿𨱒冨懡浠ゅ彲浠ヤ娇姣忎釜鐢ㄦ埛瀵规暟鎹搴撶殑妫绱㈤檺鍒跺埌鐗瑰畾镄勬暟鎹搴揿硅薄涓婏纴浣嗕笉鑳芥巿𨱒冨埌鏁版嵁搴撶壒瀹氲屽拰鐗瑰畾镄勫垪涓娿傞氲繃瑙嗗浘锛岀敤鎴峰彲浠ヨ闄愬埗鍦ㄦ暟鎹镄勪笉钖屽瓙闆嗕笂锛
銆銆浣跨敤𨱒冮檺鍙琚闄愬埗鍦ㄥ彟涓瑙嗗浘镄勪竴涓瀛愰泦涓婏纴鎴栨槸涓浜涜嗗浘鍜屽熀琛ㄥ悎骞跺悗镄勫瓙闆嗕笂銆
銆銆* 阃昏緫鏁版嵁镫绔嬫с傝嗗浘鍙甯锷╃敤鎴峰睆钄界湡瀹炶〃缁撴瀯鍙桦寲甯︽潵镄勫奖鍝嶃