MySQL中索引和視圖

索引

1、概述

全部的Mysql列類型均可以被索引。mysql

mysql支持BTREE索引、HASH索引、前綴索引、全文本索引(FULLTEXT)【只有MyISAM引擎支持,且僅限於char,varchar,text列】、空間列索引【只有MyISAM引擎支持,且索引的字段必須非空】,但不支持函數索引。sql

MyISAM和InnoDB存儲引擎的表默認建立BTREE索引,
MEMORY存儲引擎的表默認建立HASH索引。數據庫

2、建立索引

create index語法爲:函數

create [unique|fulltext|spatial] index index_name
    [using index_type]
on tbl_name(index_col_name, ...);

index_col_name:
    col_name [(length)] [asc/desc]

也可以使用alter table增長索引,語法爲:性能

ALTER [IGNORE] TABLE tbl_name
    alter_specification [, alter_specification] ...

alter_specification:
  ...
  ADD INDEX [index_name] [index_type] (index_col_name,...)
  ...

例如:爲city表建立10個字節的前綴索引優化

mysql> create index cityName on city(Name(10));
mysql> alter table city add index cityName(Name(10));

3、查看索引

可使用show index from table;查看table表的當前全部索引。spa

4、刪除索引

drop index index_name on tbl_name;

5、BTREE索引和HASH索引

MEMORY存儲引擎的表能夠選擇使用BTREE索引和HASH索引設計

BTREE索引:rest

  • 當使用>、<、=、>=、<=、between、!=、<>或者like xxx(xxx不以通配符開始)操做符時,均可以使用相關列上的BTREE索引。

HASH索引使用注意事項:(和HASH表的侷限性有關)code

  • 只能用於使用=或<=>操做符之間的等式比較。
  • 優化器不能使用HASH索引來加速order by操做。
  • mysql不能肯定在兩個值以前大約有多少行,會影響查詢必定的效率。
  • 只能使用整個關鍵字搜索一行。

6、設計索引的原則

  • 搜索的索引列,不必定是要選擇的列。最適合索引的列是出如今where子句中的列,而不是出現select後中的列。
  • 使用惟一索引。選擇容易數值容易區分的列進行索引。例如對生日的索引要比對性別的索引要好,由於生日的列具備不一樣的值,比較容易區分,而性別列只有M和F,此時索引用處不大,每次索引都得出大約一半的行。
  • 使用短索引。對字符串的前綴索引中一般會指定一個前綴長度,若是在前10到20個字符內,多數值是惟一的,那麼就能夠沒必要對整個列進行索引,而是對前10到20個字符進行索引。這樣可以節省索引空間,減小I/O時間,提升查詢效率。
  • 不要過分索引。每一個額外索引都會佔用額外的空間,下降寫操做的性能,表修改時須要更新索引,甚至可能會重構,所以索引越多,花費的時間越長。另外MySQL在生成執行計劃的時候會考慮到各個索引,多餘的索引讓查詢優化的工做變得更加繁重。

視圖

1、概述

mysql從5.0.1版本開始提供視圖功能。

視圖是一種虛擬表,在數據庫中並不實際存在,行和列數據來自於自定義視圖的查詢中所使用的表,而且是在使用視圖是動態生成的。

2、建立或修改視圖

建立視圖須要由create view權限,而且對查詢涉及的表和列要有select權限。

若是使用create or replace或者alter權限修改視圖,還須要有該視圖的drop權限。

建立視圖語法爲:

create [or replace][algorithm = {undefined|merge|temptable}]
    view view_name[(column_list)]
    as select_statement
    [with [cascade|local] check option]

修改視圖語法爲:

alter [algorithm = {undefined|merge|temptable}]
    view view_name[(column_list)]
    as select_statement
    [with [cascade|local] check option]

mysql對視圖的定義有一些限制,例如from關鍵字後不能包含子查詢,這和其餘數據庫不一樣。

3、視圖的可更新性

視圖的可更新性和視圖中查詢的定義有關,如下類型的視圖爲不可更新的。

  • 包含聚合函數(sum,min,max,count等)、distinctgroup byhavingunion或者union all
  • 常量視圖。
  • select中包含子查詢。
  • join
  • from一個不能更新的視圖。
  • where語句的子查詢中引用了from語句中的表。

例如:如下的視圖都是不可更新的

-- 包含聚合函數
mysql > create or replace view payment_sum as 
     -> select staff_id,sum(amount) 
     -> from payment
     -> group by staff_id;

-- 常量視圖
mysql > create or replace view pi as 
     -> select 3.1415926 as pi;

-- select中包含子查詢
mysql > create view city_view as
     -> select ( select city from city where city_id = 1);

with[cascaded|local] check option選項決定了是否容許更新數據使記錄再也不知足視圖的條件,默認爲cascaded。這個選項與Oracle數據庫中的選項是相似的。

  • local:只要知足本視圖的條件就能夠更新
  • cascaded:必須知足全部針對該視圖下的全部視圖的條件才能夠更新。

4、刪除視圖

能夠一次刪除一個或多個視圖,但必需要有該視圖的drop權限。

drop view [if exists] view_name [,view_name] ... [restrict|cascaded]

例如刪除視圖pay_view

mysql> drop view pay_view1,pay_view2;
Query OK, 0 rows affected (0.00 sec)

5、查看視圖

MySQL從5.1版本開始,show tables命令不只會顯示錶的名字,還會顯示視圖的名字,而不存在單獨顯示視圖的show views命令。

一樣,能夠也能夠經過下面的命令查看:

show table status [from db_name] [like 'pattern']

例子

mysql> show table status like 'pay_view' \G
*************************** 1. row ***************************
           Name: pay_view
         Engine: NULL
        Version: NULL
     Row_format: NULL
           Rows: NULL
 Avg_row_length: NULL
    Data_length: NULL
Max_data_length: NULL
   Index_length: NULL
      Data_free: NULL
 Auto_increment: NULL
    Create_time: NULL
    Update_time: NULL
     Check_time: NULL
      Collation: NULL
       Checksum: NULL
 Create_options: NULL
        Comment: VIEW
1 row in set (0.00 sec)

若是要查看某個視圖的定義,可使用show create view查看。

例子

mysql> show create view pay_view \G
*************************** 1. row ***************************
                View: pay_view
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `pay_view` AS select `pay`.`pid` AS `pid`,`pay`.`amount` AS `amount` from `pay` where (`pay`.`amount` < 10) WITH CASCADED CHECK OPTION
character_set_client: gbk
collation_connection: gbk_chinese_ci
1 row in set (0.00 sec)

最後,還能夠經過查看系統表information_schema.views來查看視圖的相關信息。

例子

mysql> select * from information_schema.views where table_name = 'pay_view' \G
*************************** 1. row ***************************
       TABLE_CATALOG: def
        TABLE_SCHEMA: mysqldemo
          TABLE_NAME: pay_view
     VIEW_DEFINITION: select `mysqldemo`.`pay`.`pid` AS `pid`,`mysqldemo`.`pay`.`amount` AS `amount` from `mysqldemo`.`pay` where (`mysqldemo`.`pay`.`amount` < 10)
        CHECK_OPTION: CASCADED
        IS_UPDATABLE: YES
             DEFINER: root@localhost
       SECURITY_TYPE: DEFINER
CHARACTER_SET_CLIENT: gbk
COLLATION_CONNECTION: gbk_chinese_ci
1 row in set (0.03 sec)

參考資料

相關文章
相關標籤/搜索