1. 程式人生 > >1、DDL(Data Definition Language)資料庫定義語言

1、DDL(Data Definition Language)資料庫定義語言

普通索引(INDEX) 語法:ALTER TABLE 表名字 ADD INDEX 索引名字 ( 欄位名字 ) -- –直接建立索引 CREATE INDEX index_user ON user(title) -- –修改表結構的方式新增索引 ALTER TABLE table_name ADD INDEX index_name ON (column(length)) -- 給 user 表中的 name欄位 新增普通索引(INDEX) ALTER TABLE `table` ADD INDEX index_name (name) -- –建立表的時候同時建立索引 CREATE TABLE `table` (     `id` int(11) NOT NULL AUTO_INCREMENT ,     `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,     `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,     `time` int(10) NULL DEFAULT NULL ,     PRIMARY KEY (`id`),     INDEX index_name (title(length)) ) -- –刪除索引 DROP INDEX index_name ON table   主鍵索引(PRIMARY key) 語法:ALTER TABLE 表名字 ADD PRIMARY KEY (欄位名字) -- 給 user 表中的 id欄位 新增主鍵索引(PRIMARY key) ALTER TABLE `user` ADD PRIMARY key (id);   唯一索引(UNIQUE) 語法:ALTER TABLE 表名字 ADD UNIQUE (欄位名字) -- 給 user 表中的 creattime 欄位新增唯一索引(UNIQUE) ALTER TABLE `user` ADD UNIQUE (creattime);   全文索引(FULLTEXT) 語法:ALTER TABLE 表名字 ADD FULLTEXT (欄位名字) -- 給 user 表中的 description 欄位新增全文索引(FULLTEXT) ALTER TABLE `user` ADD FULLTEXT (description);   新增多列索引 語法:ALTER TABLE table_name ADD INDEX index_name ( column1, column2, column3) -- 給 user 表中的 name、city、age 欄位新增名字為name_city_age的普通索引(INDEX) ALTER TABLE user ADD INDEX name_city_age (name(10),city,age);    建立索引的時機 在WHERE和JOIN中出現的列需要建立索引,但也不完全如此:
  • MySQL只對<,<=,=,>,>=,BETWEEN,IN使用索引
  • 某些時候的LIKE也會使用索引。
  • 在LIKE以萬用字元%和_開頭作查詢時,MySQL不會使用索引
-- 此時就需要對city和age建立索引, -- 由於mytable表的userame也出現在了JOIN子句中,也有對它建立索引的必要。 SELECT t.Name   FROM mytable t LEFT JOIN mytable m ON t.Name=m.username  WHERE m.age=20 AND m.city='上海';   SELECT * FROM mytable WHERE username like'admin%'; -- 而下句就不會使用: SELECT * FROM mytable WHEREt Name like'%admin'; -- 因此,在使用LIKE時應注意以上的區別。   索引的注意事項
  • 索引不會包含有NULL值的列
  • 使用短索引
  • 不要在列上進行運算 索引會失效
  建立後表的修改 新增列 語法:alter table 表名 add 列名 列資料型別 [after 插入位置]; 示例: -- 在表開頭新增一個欄位 ALTER TABLE table_name ADD field_name VARCHAR(10) NOT NULL FIRST; -- 在表students的最後追加列 address:  alter table students add address char(60); -- 在名為 age 的列後插入列 birthday:  alter table students add birthday date after age;   修改列 語法:alter table 表名 change 列名稱 列新名稱 新資料型別; -- 將表 tel 列改名為 telphone:  alter table students change tel telphone char(13) default "-"; -- 將 name 列的資料型別改為 char(16):  alter table students change name name char(16) not null; alter table table_name MODIFY field_name VARCHAR(100) NOT NULL;   刪除列 語法:alter table 表名 drop 列名稱; -- 刪除表students中的 birthday 列:  alter table students drop birthday;   重命名錶 語法:alter table 表名 rename 新表名; -- 重新命名 students 表為 workmates:  alter table students rename workmates;   清空表資料 語法:delete from 表名; truncate 表名; -- 清空表為 workmates 裡面的資料,不刪除表。  delete from workmates; 可以加where指定刪除部分記錄 truncate table_name; 刪除所有記錄   刪除整張表 語法:drop table 表名; -- 刪除 workmates 表:  drop table workmates;   刪除整個資料庫 語法:drop database 資料庫名; -- 刪除 samp_db 資料庫:  drop database samp_db;   檢查表 CHECK TABLE table_name; 修復表 REPAIR TABLE table_name; 優化表 OPTIMIZE TABLE table_name; 分析表 ANALYZE TABLE table_name; 顯示指定表的表結構 DESCRIBE table_name; show creata table table_name;     資料庫結構優化 1)正規化優化: 比如消除冗餘(節省空間。。) 2)反正規化優化:比如適當加冗餘等(減少join) 3)拆分表: 分割槽將資料在物理上分隔開,不同分割槽的資料可以制定儲存在處於不同磁碟上的資料檔案裡。這樣,當對這個表進行查詢時,只需要在表分割槽中進行掃描,而不必進行全表掃描,明顯縮短了查詢時間,另外處於不同磁碟的分割槽也將對這個表的資料傳輸分散在不同的磁碟I/O,一個精心設定的分割槽可以將資料傳輸對磁碟I/O競爭均勻地分散開。對資料量大的時時表可採取此方法。可按月自動建表分割槽。 4)拆分其實又分垂直拆分和水平拆分: 案例: 簡單購物系統暫設涉及如下表: 1.產品表(資料量10w,穩定) 2.訂單表(資料量200w,且有增長趨勢) 3.使用者表 (資料量100w,且有增長趨勢) 以
mysql
為例講述下水平拆分和垂直拆分,mysql能容忍的數量級在百萬靜態資料可以到千萬 垂直拆分:解決問題:表與表之間的io競爭 不解決問題:單表中資料量增長出現的壓力 方案: 把產品表和使用者表放到一個server上 訂單表單獨放到一個server上 水平拆分: 解決問題:單表中資料量增長出現的壓力 不解決問題:表與表之間的io爭奪 方案: 使用者表通過性別拆分為男使用者表和女使用者表 訂單表通過已完成和完成中拆分為已完成訂單和未完成訂單 產品表 未完成訂單放一個server上 已完成訂單表盒男使用者表放一個server上 女使用者表放一個server上