全部的Mysql列類型均可以被索引。mysql
mysql支持BTREE索引、HASH索引、前綴索引、全文本索引(FULLTEXT)【只有MyISAM引擎支持,且僅限於char,varchar,text列】、空間列索引【只有MyISAM引擎支持,且索引的字段必須非空】,但不支持函數索引。sql
MyISAM和InnoDB存儲引擎的表默認建立BTREE索引,
MEMORY存儲引擎的表默認建立HASH索引。數據庫
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));
可使用show index from table;
查看table表的當前全部索引。spa
drop index index_name on tbl_name;
MEMORY存儲引擎的表能夠選擇使用BTREE索引和HASH索引設計
BTREE索引:rest
between
、!=、<>或者like xxx
(xxx不以通配符開始)操做符時,均可以使用相關列上的BTREE索引。HASH索引使用注意事項:(和HASH表的侷限性有關)code
order by
操做。where
子句中的列,而不是出現select
後中的列。mysql從5.0.1版本開始提供視圖功能。
視圖是一種虛擬表,在數據庫中並不實際存在,行和列數據來自於自定義視圖的查詢中所使用的表,而且是在使用視圖是動態生成的。
建立視圖須要由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
關鍵字後不能包含子查詢,這和其餘數據庫不一樣。
視圖的可更新性和視圖中查詢的定義有關,如下類型的視圖爲不可更新的。
sum
,min
,max
,count
等)、distinct
、group by
、having
、union
或者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
:必須知足全部針對該視圖下的全部視圖的條件才能夠更新。能夠一次刪除一個或多個視圖,但必需要有該視圖的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)
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)