mysql視圖
注意:用索引後能節省檢索的時間但是也會影響插入的速度,因為插入數據後系統會按照索引進行排序。如果有大量記錄需要插入最好先刪除表中的索引然後插入數據。插入後再創建索引。
普通索引:創建索引時,不附加任何限制條件。
唯一索引:創建該索引時,限制該索引的值必須是唯一的。主鍵是一種特殊唯一性索引。
全文索引:使用FULLTEXT參數可以設置索引為全文索引。全文索引只能創建在char、varchar或text類型字段上。只有MyISAM存儲引擎支持全文檢索。默認情況下,全文索引搜索執行方式不區分大小寫。但索引列使用二進制排序後可以執行區分大小寫的全文索引。
單列索引:在單個字段上創建索引。只根據該字段進行索引。單列索引可以是普通索引,也可以是唯一性索引,還可以是全文索引。只要保證該索引只對應一個字段即可。
多列索引:在表的多個字段上創建一個索引。該索引指向創建時對應的多個字段,可以通過這幾個字段進行查詢。但是,只有查詢條件中使用了這些字段中第一個字段時,索引才會被使用。如,在表中的id、name和sex字段上建立一個多列索引,那麼只有查詢條件使用了id字段時該索引才會被使用。
空間索引:使用SPATIAL參數可以設置索引為空間索引。空間索引只能建立在空間數據類型上,這樣可以提高系統獲取空間數據的效率。空間數據類型包括GEOMETRY、POINT、LINESTRING、POLYGON等。目前只有MyISAM存儲引擎支持空間檢索且索引的字段不能為空值。
一、創建表時創建索引格式:create table index1(
id int,
name varcahr(10),
[unique|fulltext|spatial] index | key [別名] ( 屬性名1 [(長度)] [asc|desc])
)
注:index和key參數用來指定字段為索引的,兩哲選擇其中之一就行,作用是一樣的。‘別名’也是可選的參數,用來給索引取新名稱,屬性名1參數知道索引對應的字段的名稱,該字段必須是前面定義好的字段,‘長度’是可選參數指索引的長度,必須是字符串類型才可以使用。asc|desc都是可選參數表示升降序排列。
##查看索引是否被使用:explain select * from index1 where 索引列=某值 \G,結果中possible_keys 和key值都為索引名,說明該索引已經存在,extra:using index condition 表示已經開始起作用。
例:
1、普票索引
create table index1(
id int,
name varchar(20),
sex boolean,
index(id)
)
2、創建唯一索引
create table index1(
id int unique,
name varchar(20),
sex boolean,
unique index index2_id(id asc)
)
注:這裡的id字段可以沒有進行唯一性約束,也可以在該字段上成功創建唯一性索引。但是這樣可能達不到提高查詢速度的目的。
3、創建全文索引
create table index3(
id int,
info varchar(20),
fulltext index index3_info(info)
)engine=MyISAM;
4、創建單列索引
在表的單個字段上創建索引
create table index4(
id int,
subject varchar(30),
index index4_st(subject(10))
)
注:subject字段長度為30而索引長度只有10,目的是為了提高查詢速度。對於字符型數據可以不用查詢全部信息,而只查詢其前面的若干字符信息。
5、創建多列索引
create table index5(
id int,
name varchar(20),
sex char(4),
index index5_ns(name,sex)
)
二、在已經存在的表上創建索引
1、create語句創建索引格式:
create [unique|fulltext|spatial] index 索引名 on 表名 (屬性名 [(長度)] [asc|desc]);
例:創建普通索引create index index7_id on example0(id);
2、alter table語句創建索引格式:
alter table 表名 add [unique|fulltext|spatial] index 索引名(屬性名 [(長度)] [asc|desc]);
例:創建普通索引 alter table example0 add index index13_name(name(20));
三、刪除索引
1、格式:drop index 索引名 on 表名; 注:查看索引名可以用show create table 表名 \G
2、格式:alter table 表名 drop index 索引名;
---------------------------------
視圖是虛擬表,是從數據庫中一個或多個表中導出來的表。視圖還可以從已經存在的視圖的基礎上定義。數據庫中只存放視圖的定義,沒有視圖中的數據,這些數據都存放在原來的表中。視圖不支持輸入記錄的功能
創建視圖格式:
create [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]
VIEW 視圖名 [(屬性清單)]
AS SELECT 語句
[WITH [CASCADED|LOCAL] CHECK OPTION];
注:ALGORITHM是可選參數表示視圖選擇的算法,屬性清單是可選參數指定了視圖中各個屬性的名詞,默認情況下與select語句中查詢的屬性相同;WITH CHECK OPTION是可選參數表示更新視圖時要保證在該視圖的權限范圍內。
ALGORITHM中undefined選項表示mysql將自動選擇所要使用的算法;merge選項表示將使用視圖的語句與視圖定義合並起來,使得視圖定義的某一部分取代語句的對應部分;temptable選項表示將視圖的結果存入臨時表,然後用臨時表執行語句。
CASCADED表示更新視圖時要滿足所有相關視圖和表的條件,該參數為默認值;local表示更新視圖時,要滿足該視圖本身的定義的條件即可。
未指定屬性清單的情況下視圖的屬性名與select語句查詢的屬性名相同。
注一:創建視圖時最好加上WITH CHECK OPTION參數而且最好加上CASCADED參數。這樣,從視圖上派生出來的新視圖後,更新新視圖需要考慮其父視圖的約束條件。這張方式比較嚴格可以保證數據安全性。
注二:創建視圖要有create view的權限,同時要有select權限。在mysql數據庫下面的user表中保存這些權限信息,可以使用select語句查詢。
select Select_priv,Create_view_priv from mysql.user where user='用戶名';
一、查看視圖:describe語句或show create view語句 或show table status語句或information_ schema數據庫下的views表
二、修改視圖
1、create or replace 語句來修改視圖
create or replace [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]
VIEW 視圖名 [(屬性清單)]
AS SELECT 語句
[WITH [CASCADED|LOCAL] CHECK OPTION];
注:create or replace語句不僅可以修改已經存在的視圖還可以創建新的視圖。
2、alter語句修改視圖
alter [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]
VIEW 視圖名 [(屬性清單)]
AS SELECT 語句
[WITH [CASCADED|LOCAL] CHECK OPTION];
注:alter只能修改已經存在的視圖。
三、更新視圖
更新視圖指通過視圖來insert、update、delete表中的數據。視圖更新都會轉換到基本表來更新。更新視圖只能更新權限范圍內的數據,超出范圍就不能更新了。
例:update 視圖名 set name='a';更新後基本表內容也被更新
有以下情況不能更新視圖:1、包含sum()、count()、max()、min()等函數2、union、union all、distinct、group by、having等關鍵字。3、常量視圖4、視圖中的select中包含子查詢5、由不可更新的視圖導出的視圖6、創建視圖時,ALGORITHM為TEMPTABLE類型,該類型是系統臨時表是不能更新的。7、視圖對應的表上存在沒有默認值的列,而且該列沒有包含在視圖裡。因為,在更新視圖時,這個沒有默認值的記錄將沒有值插入,也沒有null值插入。數據庫系統是不會允許這樣的情況出現的,會阻止視圖更新。8、WITH [CASCADED|LOCAL] CHECK OPTION也將決定視圖能否更新。local參數表示更新視圖時滿足該視圖本身的定義條件即可;CASCADED參數表示更新視圖時要滿足所有相關視圖和表的條件。沒有指明時默認為CASCADED。
四、刪除視圖
注:刪除視圖不會影響基本表中的數據
格式:drop view [if exists] 視圖名列表 [restrict|cascade]; if exists參數指判斷視圖存在,如果存在則執行不存在則不執行,“視圖名列表”參數表示要刪除的視圖的名稱列表,各視圖名用逗號隔開。
一、查詢是否存在drop權限
select drop_priv from mysql.user where user='用戶名';