表結構-索引

DAY02

一、修改表結構

修改表結構會影響表中已有記錄,表結構的修改受表中已有記錄的限制。因此要在插入表記錄之前修改表結構,若已有記錄,在修改前先備份。

默認只有數據庫管理員root從數據庫服務器本機登錄時,纔有修改表結構的權限 

1、alter table  數據庫名.表名  處理動作;   //修改表結構

處理動作:

1.1添加新字段: add

格式:alter  table  數據庫名.表名 add 字段名…

例:

mysql> alter table  數據庫名.表名

mysql> add 字段名  字段類型(寬度)  約束條件 after 字段名,

mysql> add 字段名  字段類型(寬度)  約束條件 first,

mysql> add 字段名  字段類型(寬度)  約束條件;

 

first   //把新添加的字段添加在所有字段的上方

after字段名  //把新字段添加在指定字段名的下方

              

        默認新添加的字段追加在已有字段末尾first把新添加的字段添加在所有字段的上方,’after字段名’ 把新字段添加在指定字段名的下方

     1.2刪除字段: drop   

格式:alter  table  數據庫名.表名 drop  字段名;

例:

mysql> alter  table  數據庫名.表名

mysql>drop字段名,

mysql>drop字段名;

 

      1.3修改字段類型:  modify   

格式:alter  table  數據庫名.表名  modify  字段名;

mysql> alter  table  數據庫名.表名

mysql> modify  字段名  新字段類型(寬度)  約束條件,

mysql>modify 字段名  新字段類型(寬度)  約束條件,

mysql>modify 字段名  新字段類型(寬度)  約束條件;

修改時,修改部分寫上新設置,不變的原樣寫上

1.4修改字段名: change  (既能該名字,又能該類型)

格式:alter  table  數據庫名.表名 change 原字段名 新字段名

例:

mysql> alter  table  數據庫名.表名

mysql>change原字段名 新字段名字段類型(寬度) 約束條件,

mysql> change 原字段名 新字段名 字段類型(寬度) 約束條件,

mysql> change 原字段名 新字段名 字段類型(寬度) 約束條件;

change 即能改字段名 也能改約束條件 ,如果只改字段名,後面字段類型,約束條件原樣落下

 

 

2、alter  table  原表名  rename  to  新表名;   //修改表名

3create  table  新表名  SQL查詢語句;    //複製表  

複製表時,原表中的Key的屬性不會複製給新表

例:create table newuserselect * from mysql.user;

4create table 新表名 沒有查詢結果的SQL語句; //複製原表的表結構

   SQL查詢語句結果爲空時,複製表結構

   例:create table newuser1select * from mysql.user where host=’12’;

delete  from  表名; //刪除所有表記錄

drop table 表名;  //刪除表

update 表名 set 字段名= where 條件  //更新表記錄

例:update yg_tab set yg_id=8 where yg_id=2;

mysql>update mysql.user set host='192.168.1.1' wherehost='192.168.1.10';

二、mysql索引類型

1、什麼是索引

相當於書的目錄,表結構中的Key字段

不同的索引有不同作用,功能,使用規則也不同。

2、索引的優缺點

    優點:加快查詢表記錄速度

缺點:減慢對錶記錄的寫速度(insertupdate delete)、佔物理磁盤空間。

默認情況下用.MYI文件存儲表索引信息 .MYD存儲表記錄 .frm存儲表結構

3、怎麼查看錶裏是否有索引字段

   查看錶結構,desc 表名,再看 key字段是否有值,不同的值代表不同索引類型。

4、怎麼看錶裏的索引信息

    show index from 數據庫名.表名   //查看錶的索引字段詳細信息

# Show create table t9 //查看t9表的建表過程

索引名key_name

索引字段名Column_name

 

索 引 算法Index_type  (BTREE 、B+TREE、hash)

默認使用的算法是BTREE算法

BTREE算法:二叉樹算法

 

5、mysql支持哪些索引 ,使用說明

      不同的索引類型有不同的功能和約束方式

      使用索引時要滿足索引的使用規則

 

什麼是索引

索引相當於一本書的目錄

優點:加快查詢速度

 

缺點 佔用空間,減慢更新速度

普通索引index :一個表中可以把多個字段設置爲index字段,

index字段值可以重複,把經常做查詢條件的字段設置爲index字段,index字段的KEY標誌是MUL

創建index字段

  1. 1.   把已有表中的某個字段設置爲index字段

Create            index         name                 on                       stu (name);

                             索引名稱(通常和字段重名)         表名(字段名);         

Show index from 表名:   \G 換行顯示

查看一個表的索引詳細信息,默認使用BTREE算法

Drop index 索引名 on 表名

刪除索引字段index 屬性

      BTREE算法又稱二叉樹算法

Update 表名   set 字段名=值;

Update tea3 settea_id=1

更新表中對應字段名稱爲值

 

  1. 2.   建表時指定索引字段

Create table  表名(字段名 字段類型(寬度) 條件,index(索引字段,索引字段)

默認第一個作爲索引名。

mysql> create table tea3(

    -> name char(3) notnull,

    -> age int(3),

    -> index(name),

    -> index(age));

二叉樹深度= 分開後的高度

●主    鍵primary key:一個表中只可以有一個主鍵字段且主鍵字段的值不可以重複。標誌爲PRI

當把一個表中的多個字段設置爲primary key字段時,叫複合主鍵複合主鍵要在建表之初一起創建。 向表中的複合主鍵"字段"插值時,只要複合主鍵"字段的值"不同時重複就可以。

primarykey 通常與auto_increment(自動增長) 連用,作用是讓字段值自動增長。每添加一條記錄,字段值自動加 +1, 是從當前記錄最大值開始

通常把表中查詢時能夠唯一定位一條記錄的字段設置爲primary key 字段。

加auto_increment屬性字段類型要是整型數值類型 只有primary key 纔可以使用auto_increment屬性。

如果不是主鍵不能設置auto_increment。(auto_increment 自動增長,字段類型是整數型)

通常把編號字段作爲主鍵,自動增長的初始值是零

讓字段的值自動增長要滿足如下條件”

  1. 1.  字段類型必須是整形數值類型

  2. 2.  必須是主鍵字段  (僅主鍵可設置自動增長,主鍵可不設置自動增長

  3. 3.  Createtable tea5(

Id int(3)primary key,

Namechar(3),

Age int(3)

);

複合主鍵  複合主鍵要在建表之初一起創建

 

●外    鍵foreign key:外鍵就是表與表之間做關聯,讓當前表裏字段的值受另一表裏字段值限制

外鍵的使用規則?建外鍵條件:(1)表的存儲引擎要是innodb存儲引擎

(2)外鍵字段的類型要一致

(3)被參考字段要有明確的索引(index,primary key)7,

也就是必須要建索引。

具有外鍵屬性的字段不能直接刪除,表可以刪除。子表中一個字段可以參考不同父表中的字段(插入

的數據必須在兩個父表中都存在)。子表中的不同字段也可以參考不同父表中的字段(插入的數據必

須在兩個父表中分別存在)。若要刪除父表,需先刪除子表的外鍵約束。

建表:

Createtable tab_name(字段)engine=innodfb;   // 建表設置存儲引擎

創建外鍵: 在下方

      全文索引 fulltext

唯一索引unique:

使用規則:

一個表中可以有多個unique字段,unique字段值不可以重複,unique字段key標誌是UNI,unique字段值允許爲NULL,當修改爲不允許爲NULL時,則字段限制與主鍵相同。

           設置唯一索引

create  uniqueindex 索引名 on 表名(索引字段)

create  unique index tea_id on tea3(tea_id)

建表時建立

Create table tea4

Tea_id int(3)not null,

Name char(3)not null,

Age   int(3) not null,

Sex   enum(“m“,”w”),

Index (name),

Unique(tea_id));

 

6、如何在表裏設置索引字段

(1)建表時創建索引字段

1設置index字段、unique字段

create table stu(

stu_id  varchar(10),

name varchar(10) not null ,

age  tinyint(3)unsigned,

sex  enum(“boy”,”girl”),

index (name,sex), //默認把第一個作爲索引名,這是需要用show index from 數據庫名.表名  顯示詳細索引信息。

unique(stu_id)

);

 

         2)設置主鍵


create    table t1(

id int(2) primary key,

name    varchar(9),

age    int(2)

);

           


 

 

 

 

 

 

創建複合主鍵  (只能在建表之初創建)

create table t2 (

ip varchar(15),

port varchar(5),

sername varchar(10),

status enum(‘deny’,’allow’) default ‘deny’,

primary key(ip,port)

);

 

 

 

mysql> create table ser (

    -> c_ip char(15),

    -> ser_nvarchar(15),

    -> portchar(5),

    -> statusenum("allow","deny") default "deny",

    -> primarykey(c_ip,port)

    -> );

3)創建外鍵

Createtable tab_name(字段)engine=innodfb;   // 建表設置存儲引擎

 

foreign key (當前表裏字段名) references 表名(表名裏的字段名)

on updatecascade   //同步更新  on delete cascade    //同步刪除  這兩個之間用空格隔開。

Create  tablegz_tab(

Gz_id int(3) not null ,

 

Show create  table  表名

 

刪除外鍵

Alter table  表名drop foreign key 外鍵名

delete from 表名; // 刪除表中所有記錄

      where 字段名=值;

 

 

在已有表中添加索引字段

1)添加index字段

create index 索引名 on 表名(字段名列表);  //通常索引名與字段名同名

例:create index name on stu(name);

    create index sexon stu(sex);

2)添加unique字段   //若表記錄中unique字段值不唯一,則不成功

createunique index 索引名 on 表名(字段名列表);

例:create unique index stu_id on stu(stu_id);

3添加主鍵  //若表記錄中主鍵字段值有NULL,則不成功

alter table 表名 add primary key(字段名);

例:delete from t1 where id is null;  //刪除t1表中id值爲空的記錄

alter table t1 addprimary key(id);

alter table t1 modify id int(2) not null auto_increment;//主鍵通常與auto_increment 連用

         4)添加外鍵

          alter table 子表名 add foreign key(字段名) references 父表名(字段名);//當子表字段下有值並不在父表中時,添加不成功

 

7、如何刪除表中字段的索引屬性

    1)刪除index索引、unique索引

drop index 索引名 on 表名;

例:drop  index  name  on stu;

drop  index  stu_id on  stu;

     2)刪除主鍵  若有auto_increment,需先刪除自動增長

     alter table t1 modify id int(2) notnull;   修改id字段的約束條件

     alter table t1 drop primary key;   //刪除主鍵 

     3刪除外鍵

     alter table t1 drop foreign key  外鍵名;  //通過show create table表名查看外鍵名

     例:altertable t1 drop foreign key  t_ibfk_1;

三、mysql存儲引擎


     1) MyISAM特點:支持表級鎖定,不支持行級鎖定,不支持事務,獨享表空間,多用在查詢、插入較多的表。

         相關的表: XXX.frm 存放的表結構  XXX.MYI  索引信息   XXX.MYD表中的數據 記錄

2)innodb支持事務和事務回滾, 支持表級/行級鎖定 共享表表空間

事務= 一次sql操作從開始到結束的過程

xxx.frm 存儲表結構

xxx.ibd 存儲數據

索引和記錄用同一個文件存儲/var/lib/mysql/ibdata1,ibdata1在服務初始化時生成,10M,用完後,服務器自動增大)

事務:一次SQL操作從開始執行到正確執行結束的過程

         事務回滾:ib_logfile0  ib_logfile1

         set autocommit=0;  // 關閉自動提交功能

start transaction; //開啓事務

create table 30(id int) engine=innodb;

insert into t30 values(200);

select * from t30;

在另一終端查看(事務未提交,查看不到)

rollback;   //回滾

insert into t30 values(100);

commit;//提交,事務結束,永久生效

      3)myisam支持表鎖,innodb支持行鎖

         鎖機制:解決用戶的併發訪問衝突問題

鎖粒度:表鎖-併發訪問量低 系統開銷小

                 行鎖-併發訪問量高  系統開銷大

                 頁級鎖:對整個頁面(MySQL管理數據的基本存儲單位)進行加鎖                               

         鎖類型:寫鎖(delete update insert)互斥鎖、排它鎖特點:獨佔鎖,上鎖期間其他線程不能讀表或寫表

                 讀鎖(select desc show)共享鎖特點:支持併發讀,寫操作被鎖

                

幻讀(兩次讀出的數據不同)與髒讀(從內存讀出的數據)

                 死鎖:鎖超時

          寫鎖優先級高於讀鎖*

獲取寫鎖時,其他操作均需等待寫鎖釋放後執行。

查看當前的鎖狀態

  查看table_lock開頭的變量,% 作通配符

show status like ‘ table_lock% ’;

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