數據是按照數據結構組織、存儲和管理數據的倉庫
每一個數據庫都有一個或多個不一樣的API用於建立,訪問,管理,搜索和複製所保存的數據。
咱們也能夠將數據存儲在文件中,可是在文件中讀寫數據速度相對較慢。
因此,如今咱們使用關係型數據庫管理系統(RDBMS)來存儲和管理的大數據量,所謂的關係型數據庫,是創建在關係模型基礎上的數據庫,藉助於集合代數等數學概念和方法來處理數據庫中的數據。
RDBMS即關係數據庫的管理系統(Relational Databases Management System)的特色:
一、數據以表格的形式出現
二、每行爲各類記錄名稱
三、每列爲記錄名稱所對應的數據域
四、許多的行和列組成一張表單。
五、若干的表單組成database。java
在咱們開始學習MySQL數據庫前,讓咱們先了解下RDBMS的一些術語:
數據庫:數據庫是一些關聯表的集合。
數據表:表示數據的矩陣,在一個數據庫中的表看起來像一個簡單的電子表格。
列:一列(數據元素)包含了相同的數據,例如郵政編碼的數據。
行:一行(=元組,或記錄)是一組相關的數據,例如一條用戶訂閱的數據。
冗餘:存儲兩倍說句,冗餘可使系統速度更快(表的規範化程度越高,表與表之間的關係就越多;查詢時可能常常須要在多個表之間進行鏈接查詢,而進行鏈接操做會下降查詢速度,例如,學生的信息存儲在student表中,院系信息存儲在department表中,經過student表中的dept_id字段與department表創建關聯關係。若是要查詢一個學生所在系的名稱,必須從student表中查詢學生所在院系的編號(dept_id),而後根據這個編號去department查找系的名稱,若是常常須要進行這個操做時,鏈接查詢會浪費不少的時間,所以能夠在student表中增長一個冗餘字段dept_name,該字段用來存儲學生所在院系的名稱,這樣就不用每次都進行鏈接操做了。)
主鍵:主鍵是惟一的,一個數據表中只能包含一個主鍵,你可使用主鍵來查詢數據
外鍵:外鍵用於關聯兩個表。
複合鍵:複合鍵(組合鍵)將多個列做爲一個索引鍵,通常用於複合索引。
索引:使用索引可快速訪問數據庫表中的特定信息,索引是對數據庫表中一列或多列的值進行排序的一種結構,相似於書籍的目錄。
參照完整性:參照的完整性要求關係中不容許引用不存在的實體,與實體完整性是關係模型必須知足的完整性約束條件,目的是保證數據的一致性。mysql
MySQL是最流行的關係型數據庫管理系統,在web應用方面MySQL是最好的RDBMS應用軟件之一,MySQL是一種關係型數據庫管理系統,關聯數據庫將數據保存在不一樣的表中,而不是將全部數據放在一個大倉庫中,這樣就增長了速度並提升了靈活性。
MySQL是開源的,因此你不須要支付額外的費用。
MySQL支持大型的數據庫,能夠處理擁有上千萬條記錄的大型數據庫。
MySQL使用標準的SQL數據語言形式。
MySQL能夠容許於多個系統上,而且支持多種語言,這些編程語言包括C、C++、Python、java、perl、PHP、eiffel、ruby和tcl等。
MySQL對PHP有很好的支持,PHP是目前最流行的web開發語言。
MySQL支持大型數據庫,支持5000萬條記錄的數據倉庫。32位系統表文件最大可支持4GB,64爲操做系統最大的表文件爲8TB。
MySQL是能夠定製,採用了GPL協議,你能夠修改源碼來開發本身的MySQL系統。 linux
Linux平臺上推薦使用rpm包來安裝MySQL,MySQL AB提供瞭如下RPM包的下載地址。
MySQL-MySQL服務器。你須要該選項,除非你只想鏈接運行在另外一臺機器上的MySQL的服務器。
MySQL-client MySQL客戶端程序,用於鏈接並操做MySQL服務器。
mysql-devel-庫和包含文件,若是你想要編譯其它mysql客戶端,例如perl模塊,則須要安裝該RPM包。
MySQL-shared-該軟件包包含某些語言和應用程序須要動態狀態的共享庫(libmysqlclient.so*),使用MySQL。
MySQL-bench-MySQL數據庫服務器的基準和性能測試工具。
如下安裝MySQL RMP的實例是在SuSE Linux系統上進行,固然該安裝步驟也適合應用於其餘支持RPM的Linux系統,如:CentOS。web
經過如下命令執行Mysql安裝,rpm包爲你下載的rpm包: [root@host]# rpm -i MySQL-5.0.9-0.i386.rpm 以上安裝mysql服務器的過程會建立mysql用戶,並建立一個mysql配置文件my.cnf。 你能夠在/usr/bin和/usr/sbin中找到全部與MySQL相關的二進制文件。全部數據表和數據庫將在/var/lib/mysql目錄中建立。 如下是一些mysql可選包的安裝過程,你能夠根據本身的須要來安裝: [root@host]# rpm -i MySQL-client-5.0.9-0.i386.rpm [root@host]# rpm -i MySQL-devel-5.0.9-0.i386.rpm [root@host]# rpm -i MySQL-shared-5.0.9-0.i386.rpm [root@host]# rpm -i MySQL-bench-5.0.9-0.i386.rpm
你能夠在 MySQL Client(Mysql客戶端) 使用 mysql 命令鏈接到Mysql服務器上,默認狀況下Mysql服務器的密碼爲空,因此本實例不須要輸入密碼。
命令以下:sql
[root@host]# mysql 以上命令執行後會輸出 mysql>提示符,這說明你已經成功鏈接到Mysql服務器上,你能夠在 mysql> 提示符執行SQL命令: mysql> SHOW DATABASES; +----------+ | Database | +----------+ | mysql | | test | +----------+ 2 rows in set (0.13 sec) Mysql安裝後須要作的 Mysql安裝成功後,默認的root用戶密碼爲空,你可使用如下命令來建立root用戶的密碼: [root@host]# mysqladmin -u root password "new_password"; 如今你能夠經過如下命令來鏈接到Mysql服務器: [root@host]# mysql -u root -p Enter password:******* 注意:在輸入密碼時,密碼是不會顯示了,你正確輸入便可。 Linux系統啓動時啓動 MySQL 若是你須要在Linux系統啓動時啓動 MySQL 服務器,你須要在 /etc/rc.local 文件中添加如下命令: /etc/init.d/mysqld start 一樣,你須要將 mysqld 二進制文件添加到 /etc/init.d/ 目錄中。
首先,咱們須要經過如下命令來檢查MySQL服務器是否啓動: ps -ef | grep mysqld 若是MySql已經啓動,以上命令將輸出mysql進程列表, 若是mysql未啓動,你可使用如下命令來啓動mysql服務器: root@host# cd /usr/bin ./mysqld_safe & 若是你想關閉目前運行的 MySQL 服務器, 你能夠執行如下命令: root@host# cd /usr/bin ./mysqladmin -u root -p shutdown Enter password: ******
若是你須要添加 MySQL 用戶,你只須要在 mysql 數據庫中的 user 表添加新用戶便可。 如下爲添加用戶的的實例,用戶名爲guest,密碼爲guest123,並受權用戶可進行 SELECT, INSERT 和 UPDATE操做權限: root@host# mysql -u root -p Enter password:******* mysql> use mysql; Database changed mysql> INSERT INTO user (host, user, password, select_priv, insert_priv, update_priv) VALUES ('localhost', 'guest', PASSWORD('guest123'), 'Y', 'Y', 'Y'); Query OK, 1 row affected (0.20 sec) mysql> FLUSH PRIVILEGES; Query OK, 1 row affected (0.01 sec) mysql> SELECT host, user, password FROM user WHERE user = 'guest'; +-----------+---------+------------------+ | host | user | password | +-----------+---------+------------------+ | localhost | guest | 6f8c114b58f2ce9e | +-----------+---------+------------------+ 1 row in set (0.00 sec) 在添加用戶時,請注意使用MySQL提供的 PASSWORD() 函數來對密碼進行加密。 你能夠在以上實例看到用戶密碼加密後爲: 6f8c114b58f2ce9e. 注意:在 MySQL5.7 中 user 表的 password 已換成了authentication_string。 注意:在注意須要執行 FLUSH PRIVILEGES 語句。 這個命令執行後會從新載入受權表。 若是你不使用該命令,你就沒法使用新建立的用戶來鏈接mysql服務器,除非你重啓mysql服務器。 你能夠在建立用戶時,爲用戶指定權限,在對應的權限列中,在插入語句中設置爲 'Y' 便可,用戶權限列表以下: Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Reload_priv,Shutdown_priv,Process_priv,File_priv,Grant_priv,References_priv,Index_priv,Alter_priv 另一種添加用戶的方法爲經過SQL的 GRANT 命令,你下命令會給指定數據庫TUTORIALS添加用戶 zara ,密碼爲 zara123 。 root@host# mysql -u root -p password; Enter password:******* mysql> use mysql; Database changed mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP -> ON TUTORIALS.* -> TO 'zara'@'localhost' -> IDENTIFIED BY 'zara123';
MySQL數據過程當中經常使用的命令: use databasename:選擇要操做的MySQL數據庫,使用該命令後全部mysql命令都只針對該數據庫。 show databases:查看數據庫 show tables:查看數據表 show columns from 數據表:顯示數據表的屬性,屬性類型,主鍵信息,是否爲null,默認值等其餘信息。 create database testdb charset "utf8":建立數據庫 drop database testdb,刪除數據庫。 show index from 數據表:顯示數據表的詳細索引信息,包括主鍵(primary key) grant :用戶受權 flush privileges:刷新權限。
MySQL中定義數據字段的類型對你數據庫的優化是很是重要。 MySQL支持多種類型,大體能夠分爲三類:數值、日期/時間和字符串(字符)類型。 數值類型 MySQL支持全部標準sql數值數據類型。 這些類型包括嚴格數值數據類型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似數值數據類型(FLOAT、REAL和DOUBLE PRECISION)。 關鍵字INT是INTEGER的同義詞,關鍵字DEC是DECIMAL的同義詞。 BIT數據類型保存位字段值,而且支持MyISAM、MEMORY、InnoDB和BDB表。 做爲SQL標準的擴展,MySQL也支持整數類型TINYINT、MEDIUMINT和BIGINT。下面的表顯示了須要的每一個整數類型的存儲和範圍。
語法 CREATE TABLE table_name (column_name column_type); 建立一個student表 mysql> create table student( -> id int not null auto_increment, -> name char(32) not null, -> age int not null, -> register_date date, -> primary key (id) -> ); 實例解析: 若是你不想字段NULL能夠設置字段的屬性爲NOT NUll,在操做數據庫時若是輸入該字段的數據爲NUll,就會報錯。 AUTO_INCREMENT自定義列爲自增的屬性,通常用於主鍵,數值會自動加1. PRIMARY KEY 關鍵字用於定義列爲主鍵,你可使用多列來定義主鍵,列間以逗號分隔。
語法: INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN ); 插入數據 insert into student (name,age,register_date) values ("陳鑫",22,"2016-02-03"); mysql> select * from student; +----+--------+-----+---------------+ | id | name | age | register_date | +----+--------+-----+---------------+ | 1 | 陳鑫 | 22 | 2016-02-03 | +----+--------+-----+---------------+ 1 row in set (0.00 sec)
語法: SELECT column_name,column_name FROM table_name [WHERE Clause] [OFFSET M ][LIMIT N] 查詢語句中你能夠時候用一個或多個表,表之間使用逗號(,)分割,並使用where語句來設定查詢條件。 select 命令能夠讀取一條或多條記錄。 你可使用星號(*)來代替其餘字段,select語句會返回表的全部字段數據。 你能夠經過offset指定select語句開始查詢的數據偏移量,默認狀況下偏移量爲0. 你可使用limit屬性來設定返回的記錄數。 查詢數據 mysql> select * from student limit 3 offset 2; +----+-----------+-----+---------------+ | id | name | age | register_date | +----+-----------+-----+---------------+ | 3 | 劉強 | 53 | 2016-04-30 | | 4 | 白弘毅 | 31 | 2016-11-21 | | 5 | 湯中山 | 21 | 2016-12-20 | +----+-----------+-----+---------------+ 3 rows in set (0.00 sec) #從第二行開始向下查詢3條數據,limit後面跟的是3條數據,offset後面是從第2行開始讀取。 mysql> select * from student limit 3,1; +----+-----------+-----+---------------+ | id | name | age | register_date | +----+-----------+-----+---------------+ | 4 | 白弘毅 | 31 | 2016-11-21 | +----+-----------+-----+---------------+ 1 row in set (0.00 sec) #這個sql是,limit後面是從第3條開始讀,讀取1條信息。
語法: SELECT field1, field2,...fieldN FROM table_name1, table_name2... [WHERE condition1 [AND [OR]] condition2..... 如下爲操做符列表,可用於where子句中 下表中實例假定 A爲10 B爲20 操做符 描述 實例 = 等號,檢測兩個值是否相等,若是相等返回true (A = B) 返回false。 <>,!= 不等於,檢測兩個值是否相等,若是不相等返回true (A != B) 返回 true。 > 大於號,檢測左邊的值是否大於右邊的值, 若是左邊的值大於右邊的值返回true (A > B) 返回false。 < 小於號,檢測左邊的值是否小於右邊的值, 若是左邊的值小於右邊的值返回true (A < B) 返回 true。 >= 大於等於號,檢測左邊的值是否大於或等於右邊的值, 若是左邊的值大於或等於右邊的值返回true (A >= B) 返回false。 <= 小於等於號,檢測左邊的值是否小於於或等於右邊的值, 若是左邊的值小於或等於右邊的值返回true (A <= B) 返回 true。 使用主鍵來做爲 where 子句的條件查詢是很是快速的。 mysql> select * from student where register_date >"2016-08-31";
語法: UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause] update student set age=22,name=="chenxin" where id =1;
語法: DELETE FROM table_name [WHERE Clause] delete from student where id=5;
語法: SELECT field1, field2,...fieldN table_name1, table_name2... WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue' select * from student where name like "%Li";#不區分大小寫匹配 select * from student where name like binary "%li";#區分大小寫匹配
語法: SELECT field1, field2,...fieldN table_name1, table_name2... ORDER BY field1, [field2...] [ASC [DESC]] 使用ASC或DESC關鍵字來設置查詢結果是按升序或降序排列,默認狀況下,它是按升序排序。 select * from student where name like binary "%li" order by id desc; #desc是降序排序,按照id進行排序 select * from student where name like "%li" order by id;#默認按照升序排序。
SELECT column_name, function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name; mysql> select * from student; +----+-----------+-----+---------------+ | id | name | age | register_date | +----+-----------+-----+---------------+ | 1 | chenxin | 22 | 2016-02-03 | | 2 | 沁夫 | 33 | 2016-06-08 | | 3 | 劉強 | 53 | 2016-04-30 | | 4 | 白弘毅 | 31 | 2016-11-21 | | 6 | alex li | 18 | 2016-11-11 | | 7 | alex Li | 33 | 2015-11-11 | +----+-----------+-----+---------------+ 6 rows in set (0.01 sec) 接下來咱們使用 group by 語句,將數據表按名字進行分組,並統計每一個人有多少條記錄; mysql> select name,count(*) from student group by name; +-----------+----------+ | name | count(*) | +-----------+----------+ | alex li | 2 | | chenxin | 1 | | 白弘毅 | 1 | | 劉強 | 1 | | 沁夫 | 1 | +-----------+----------+ 5 rows in set (0.00 sec) 使用with rollup,#將相同name的條數的年齡相加起來,在求和。 mysql> select name,sum(age)as age_count from student group by name with rollup; +-----------+-----------+ | name | age_count | +-----------+-----------+ | alex li | 51 | | chenxin | 22 | | 白弘毅 | 31 | | 劉強 | 53 | | 沁夫 | 33 | | NULL | 190 | +-----------+-----------+ 6 rows in set (0.00 sec) 其中記錄NULL表示全部人的年齡之和。 咱們是使用coalesce來設置一個取代null的名稱,coalesce語法: mysql> select coalesce(name,'總數'),sum(age) as age_count from student group by name with rollup; +-------------------------+-----------+ | coalesce(name,'總數') | age_count | +-------------------------+-----------+ | alex li | 51 | | chenxin | 22 | | 白弘毅 | 31 | | 劉強 | 53 | | 沁夫 | 33 | | 總數 | 190 | +-------------------------+-----------+ 6 rows in set (0.00 sec)
咱們須要修改數據庫表名或者修改數據表字段時,就須要使用到MySQL alter命令。 刪除,添加或修改表字段 alter table student drop register_date; #從student表刪除register_date字段。 alter table student add phone int(11) not null; #在student表中添加phone字段。 修改字段類型及名稱 若是須要修改字段類型及名稱,你能夠在alter命令中使用modify或change子句。 例如,把字段name的類型從char(32)改成char(40),命令爲: alter table student modify name char(40); 使用change子句,語法有很大不同,在change關鍵字以後,緊跟着的是你要修改的字段名,而後指定新字段名及類型,嘗試以下實例。 alter table student change phone iphone bigint;#修更名字並改變字段類型 alter table student change iphone iphone int;#只修改字段類型,但必需要加修改的名字和修改爲的名字。 alter table 對NUll值和默認值的影響 當你修改字段時,你能夠指定是否包含只或者是否設置默認值。 如下實例,指定字段iphone爲not null 且默認值爲100 alter table student modify iphone bigint not null default 100; #注意:這裏修改的默認值是在此之後新添加的會有默認值,以前的數據是不會修改的。 修改表名 alter table student rename to alter_tb1;
外鍵,一個特殊的索引,用於關鍵2個表,只能是指定的內容。 mysql> create table class( -> id int not null primary key, -> name char(16)); Query OK, 0 rows affected (0.00 sec) mysql> create table student2( -> id int not null, -> name char(16) not null, -> class_id int not null, -> primary key (id), -> key fk_class_key (class_id), -> constraint fk_class_key foreign key (class_id) references class (id) -> ); Query OK, 0 rows affected (0.00 sec) 此時若是class表中不存在id 1,student表也插入不了,這就叫外鍵約束。 mysql> insert into student2(id,name,class_id) values(1,'alex', 1); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`testdb`.`student2`, CONSTRAINT `fk_class_key` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`)) mysql> insert into class(id,name) values(1,"linux"); Query OK, 1 row affected (0.01 sec) mysql> insert into student2(id,name,class_id) values(1,'alex', 1); Query OK, 1 row affected (0.00 sec) #若是有student表中跟這個class表有關聯的數據,你是不能刪除class表中與其關聯的紀錄的 mysql> delete from class where id =1; ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`testdb`.`student2`, CONSTRAINT `fk_class_key` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`))
咱們已經知道MySQL使用sql select命令及where子句來讀取數據表中的數據,可是當提供的查詢條件字段爲NUll時,該命令可能就沒法正常工做。 爲了處理這種狀況,MySQL提供了三大運算符: is null:當列的值是null,此運算符返回true。 is not null:當列的值不爲null,運算符返回true。 <=>:比較操做符(不一樣於=運算符),當比較的兩個值爲null時返回true。 關於null的條件比較運算是比較特殊的,你不能使用=null或!=null在列中查找null值。 在mysql中,null值與任何其它值的比較(即便是null)永遠返回false,即null=null返回false。 MySQL中處理null使用is null和is not null運算符。
咱們已經學會了若是在一張表中讀取數據,這是相對簡單的,可是真正的應用中常常須要從多張數據表中讀取數據。
本章節咱們將向你們介紹如何使用MySQL和join在兩個或多個表中查詢數據。
你能夠在select ,update,和delete語句中使用MySQL的join來聯合多表查詢。
join按照功能大體分爲以下 三類:
INNER JOIN(內鏈接,或等值鏈接):獲取兩個表中字段匹配關係的記錄。
LEFT JOIN(左鏈接):獲取左表全部記錄,即便右表沒有對應匹配的記錄。
RIGHT JOIN(右鏈接):與LEFT JOIN相反,用於獲取右表全部記錄,即便左表沒有對應匹配的記錄。
MySQL事務主要用於處理操做量大,複雜度高的數據,好比說,在人員管理系統中,你刪除一我的員,你即須要刪除人員的基本資料,也要刪除和該人員相關的信息,如郵箱,文章等,這樣,這些數據庫操做語句就構成一個事務。
在MySQL中只有使用了Innodb數據庫引擎的數據庫或表才支持事務。
事務處理能夠用來維護數據庫的完整性,保證成批的sql語句要麼所有執行,要麼所有不執行。
事務用來管理insert,update,dalete語句。
通常來講,事務是必須知足4個條件(ACID):Atomicity(原子性)、Consistency(穩定性)、Isolation(隔離性)、Durability(可靠性)
一、事務的原子性:一組事務,要麼成功,要麼撤回。
二、穩定性:有非法數據(外鍵約束之類),事務撤回
三、隔離性:事務獨立運行,一個事務處理後的結果,影響了其餘事務,那麼其餘事務會撤回,事務的100%隔離,須要犧牲速度。
四、可靠性:軟、硬件崩潰後,Innodb數據表驅動會利用日誌文件重構修改,可靠性和高速度不可兼得,innodb_flush_log_at_trx_commit選項,決定何時把事務保存到日誌裏。數據庫
完成一個事務 mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> select * from A; Empty set (0.00 sec) mysql> insert into A (id) values(1); Query OK, 1 row affected (0.00 sec) mysql> select * from A; +----+ | id | +----+ | 1 | +----+ 1 row in set (0.00 sec) mysql> commit; Query OK, 0 rows affected (0.00 sec) 回滾一個事務 mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> select * from A; +----+ | id | +----+ | 1 | +----+ 1 row in set (0.00 sec) mysql> insert into A(id)values(2); Query OK, 1 row affected (0.00 sec) mysql> rollback; Query OK, 0 rows affected (0.00 sec) mysql> select * from A; +----+ | id | +----+ | 1 | +----+ 1 row in set (0.00 sec) 備註: 若是發現不能回滾,處理以下: 1、首先查看數據的存儲引擎 mysql> show engines; +------------+---------+------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +------------+---------+------------------------------------------------------------+--------------+------+------------+ | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance | NO | NO | NO | | InnoDB | YES | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | +------------+---------+------------------------------------------------------------+--------------+------+------------+ 5 rows in set (0.00 sec) 2、查看錶使用的存儲引擎 (1) show table status from db_name where name="table_name"; (2) show create table table_name; 3、修改表引擎方法 altar table table_name engine=innodb; 4、永久生效,修改配置文件 default-storage-engine=INNODB
MySQL索引的創建對於MySQL的高效運行是很重要的,索引能夠大大提升MySQL的檢索速度。
打個比方,若是合理的設計且使用索引的MySQL是一輛蘭博基尼的話,那麼沒有設計和使用索引的MySQL就是一我的力三輪車
索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表能夠由多個單列索引,但這不是組合索引,組合索引,即一個索引包含多個列。
建立索引時,你須要確保該索引是應用在sql查詢語句的條件(通常做爲where子句的條件)
實際上,索引也是一張表,該表保證了主鍵與索引字段,並指向實體表的記錄。
上面都在說使用索引的好處,但過多的使用索引將會形成濫用。所以索引也會有它的缺點:雖然索引大大提升了查詢速度,同時卻會下降更新表的速度,如對錶進行insert、update、delete,由於更新表時,MySQL不只要保存數據,還要保存一下索引文件,創建索引會佔用磁盤空間索引文件。
編程
建立索引 這是最基本的索引,它沒有任何限制,他有如下幾種建立方式: mysql> create index index_name on student(name); mysql> desc student; +--------+------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | char(40) | YES | MUL | NULL | | | age | int(11) | NO | | NULL | | | iphone | bigint(20) | NO | | 100 | | +--------+------------+------+-----+---------+----------------+ 4 rows in set (0.00 sec) 若是是char、varchar類型,length能夠小於字段實際長度,若是是blog和text類型,必須制定length(長度)。 修改表結構 ALTER mytable ADD INDEX [indexName] ON (username(length)) 建立表的時候直接指定 CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) ); 刪除索引的語法 DROP INDEX [indexName] ON mytable;
它與前面的普通索引相似,不一樣的就是:索引列的值必須惟一,但容許有空值,若是是組合索引,則列值的組合必須惟一,他有如下幾種建立方法:
ruby
建立索引 建立索引 CREATE UNIQUE INDEX indexName ON mytable(username(length)) 修改表結構 ALTER mytable ADD UNIQUE [indexName] ON (username(length)) 建立表的時候直接指定 CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );
有四種方式來添加數據表的索引: ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 該語句添加一個主鍵,這意味着索引值必須是惟一的,且不能爲NULL。 ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 這條語句建立索引的值必須是惟一的(除了NULL外,NULL可能會出現屢次)。 ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出現屢次。 ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):該語句指定了索引爲 FULLTEXT ,用於全文索引。 如下實例爲在表中添加索引。 mysql> ALTER TABLE testalter_tbl ADD INDEX (c); 你還能夠在 ALTER 命令中使用 DROP 子句來刪除索引。嘗試如下實例刪除索引: mysql> ALTER TABLE testalter_tbl DROP INDEX (c); 使用alter命令添加和刪除主鍵 主鍵只能做用於一個列上,添加主鍵索引時,你須要確保該主鍵默認不爲空(NOT NULL)。實例以下: mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL; mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i); 你也可使用 ALTER 命令刪除主鍵: mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY; 刪除指定時只需指定PRIMARY KEY,但在刪除索引時,你必須知道索引名。 顯示索引信息 SHOW INDEX FROM table_name\G