索引與視圖

什麼是索引

索引:用於快速找出某個列中有一特定值的行,(是存放在模式(schema)中的一個數據庫對象,依賴表存在,提高對錶的索引查詢速度)

索引的優點:

    1.所有的mysql列類型(字段類型)都可以被索引,即可以給任意字段設置索引

    2.大大加快數據的查詢速度
索引的缺點:

    1.創建索引和維護索引要耗費時間,並且隨着數量的增加耗費的時間也會增加,相應減慢增刪改數據的速度

    2.索引頁需要佔用磁盤空間,創建過多索引,會造成存儲空間大量佔用。我們知道數據表中的數據也會有最大上線設置的,如果我們有大量的索引,索引文件可能會比數據文件更快達到上線值

    3.當對錶中的數據進行增加,刪除,修改時,索引也需要動態維護,降低了數據維護速度,增加查詢優化器負擔

索引的類型:

 普通索引:基本索引類型,允許索引列中的值爲空,重複。

唯一索引:值必須唯一,可以爲空值。如果爲組合索引,則列值組合必須唯一,主鍵列是特殊的唯一索引,值不可以爲空、不可重複。

單列索引:使用一個列作爲索引列,一個表可以有多個單列索引。

組合索引:在表中使用多個字段組合創建爲索引列,只有在查詢條件時使用了這些組合字段的左邊字段時,索引纔會被使用。

創建索引
        create table 表名(
    字段 字段屬性,
    index(字段)
          );

 創建唯一索引:(即在某個字段上設置索引和唯一約束)
        unique index 索引名(字段) 

創建單列索引: index 索引名(字段)

創建組合索引: index索引名(字段1,字段2...)組合索引遵循最左前綴,即只有符合最左前綴進行查詢,
        纔可以使用索引(最左原則:查詢的字段需要是最左的字段或最左字段組合進行查詢)

 最左側前綴原則

       只要包含最左側的字段,都會觸發使用索引來查詢。組合索引abc中,只有b,c,bc,cb,不會觸發索引。

       在查詢中,只要我們查詢的語句沒有問題。都會返回相應的結果。

     只是在返回結果時是否觸發了索引加快了查詢速度而已。可以加上explain 便可以查看是否觸發索引。

新增索引: 
    alter table 表名 add index 索引名(索引字段(長度));
    show index from 表名;   查看錶中已有的索引

刪除索引
    alter table 表名 drop index 索引名;

      注意:是根據索引名刪除,而不是根據列名刪除索引,通過show index from 表名'查詢索引的名字。

設計索引的原則 

       搜索的索引列,不一定是要選擇的列。最適合索引的列是出現在where子句中的列,而不是出現select後中的列。

       使用唯一索引。選擇容易數值容易區分的列進行索引。例如對生日的索引要比對性別的索引要好,因爲生日的列具有不同的值,比較容易區分,而性別列只有M和F,此時索引用處不大,每次索引都得出大約一半的行。

       使用短索引。對字符串的前綴索引中通常會指定一個前綴長度,如果在前10到20個字符內,多數值是唯一的,那麼就可以不必對整個列進行索引,而是對前10到20個字符進行索引。這樣能夠節省索引空間,減少I/O時間,提高查詢效率。

       不要過度索引。每個額外索引都會佔用額外的空間,降低寫操作的性能,表修改時需要更新索引,甚至可能會重構,因此索引越多,花費的時間越長。另外MySQL在生成執行計劃的時候會考慮到各個索引,多餘的索引讓查詢優化的工作變得更加繁重。

不能簡單的認爲“索引越多,性能越高”,不必對每個數據列都進行索引。如果很少使用或從不使用某個索引,建議刪除該索引。

什麼是視圖

       MySQL從5.0.1版本開始提供視圖功能,它是一個表或多個表的查詢結果,是一張虛擬的表,在數據庫中並不實際存在,行和列數據來自於定義視圖的查詢中所使用的表,並且是動態生成的,它不能存儲數據。

視圖的優點

    1.不佔內存空間

    2.簡化數據操作,方便查詢。不能提高查詢效率,但提供數據的獨立性

    3.它能根據數據變化而變化

    4.視圖的建立和刪除隻影響視圖本身,不影響表

    5.不建議使用視圖增刪改查

創建格式:

       create view 視圖名 as 查詢語句;        

視圖的創建
        create view 視圖名 字段列表 as 查詢語句;
        (字段列表可省略,如果定義字段列表,那麼查詢語句所查詢出的數據字段類型、順序與定義字段列表類型、順序一致。)

       create view view_temp as select name,age from temp;

      create view view_temp as select * from temp with check option;(with check option 視圖不能被修改)

查看視圖結構:
    desc 視圖名;

查看視圖基本信息:
    show table status like '視圖名';

查看視圖創建語句:
    show create view ‘視圖名’;

查看視圖中的數據:
    select * from 視圖;

刪除視圖:
    drop view 視圖名;

顯示創建語法:
    show create view v_temp;

修改視圖:
    1.create or replace view 視圖名 as 查詢語句;
    2.alter view 視圖名 as 查詢語句;

視圖和表的區別

    1、視圖是編譯好的SQL語句,是基於SQL語句的結果集形成的可視化的虛擬表,而表不是。

    2、視圖沒有實際的物理存儲數據,而表有。

    3、表記錄實際存儲的數據,視圖是窗口,通過視圖查看錶中的數據。

視圖和表的聯繫

        視圖是基於表存在的,

索引和視圖的異同

相同點:

    都可應用於數據庫,索引是表的一個特性,視圖是通過索引查詢表而得出的結果,表建立了索引字段,查詢速度也會提高。

不同點:

   1、性質不同:

  (1)索引:在關係數據庫中,索引是一種單獨的、物理的對數據庫表中一列或多列的值進行排序的一種存儲結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單。

  (2)視圖:計算機數據庫中的視圖,是一個虛擬表,其內容由查詢定義。

   2、作用不同

  (1)索引:應於表的SQL語句執行得更快。

  (2)視圖:使操作簡單化,可以對經常使用的查詢定義一個視圖,使用戶不必爲同樣的查詢操作指定條件;增加數據的安全性,通過視圖,用戶只能查詢和修改指定的數據;提高表的邏輯獨立性,視圖可以屏蔽原有表結構變化帶來的影響。

如有不足,歡迎留言指正。望不吝賜教。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章