先建立兩張表。
1.student表

2.grade表
一:mysql的複制技術
1.表與資料的複制->>實作表結構和資料的同步
create table desttable select * from srctable;
(desttable:目标表,srctable:原表)
2.表結構的複制->>隻實作表結構的同步
create table desttable select * from srctable where 0>1;
想想為什麼???
select語句既産生了表結構又産生了結果集,如果後面限制條件不成立,那麼結果集為空,就實作了隻複制表結構。
3.全表記錄的複制->>将一個表的全部記錄插入另外一個表
insert into desttable select * from srctable;
4.部分字段的複制
insert into desttable(字段一,字段二.......) select (字段一,字段二.......) from srctable;
二:索引注意事項
(1):使用FULLTEXT參數可以設定索引為全文索引,全文索引隻能建立在CHAR ,VARCHAR ,TEXT類型字段上。->>但隻有MyISAM存儲引擎支援全文索引。
(2):多列索引:在表的多列字段上建立一個索引,但隻有在查詢這些字段的第一個字段時,索引才會被使用。
(3):查詢語句使用like關鍵字進行查詢,如果比對的第一個字元為”%“時,索引不會被使用
select * from student where num like '%4'; //索引不會被使用
select * from student where num like '4%'; //索引會被使用
(4):查詢語句中使用or關鍵字時,隻有or前後兩個條件的列都是索引時,查詢時才使用索引
(5): 學會使用explain檢查索引是否被使用,我們用explain指令檢驗(2)的說法
先建立索引:create index index_nu_name on student(num,name);
#1. explain select * from student where num=2;
執行結果如下:
#2.explain select * from student where name=‘lwy’;
執行結果如下:
通過比較,我們發現,第二個的possible-key和key等都為空,而且Extra顯示查詢用where子句沒有用索引。
我們關注一下rows資訊,如果用where子句,則查詢行數為2,如果使用索引,則查詢行數為1(這張表隻有2條記錄,可以想象如果記錄為上萬條,用索引真的很快)
是以,通過實實驗證明了我們(2)的說法。
三:權限管理
mysql中的權限配置設定是按照user表,db表,tables_priv表,columns_priv表的順序進行配置設定的。資料庫系統中,
先判斷user表中的值是否是Y,如果是Y則就不需要檢查下面的表了。如果user表的為N,則依次檢查db表,tables_priv表,和columns_priv表。
簡單的說,就是user表存儲的是對所有資料庫的權限,db表存儲的是對某一資料庫的權限,tables_privs存儲的是對資料庫表的權限,columns_privs存儲的是表中列的權限。
比如我們建立一使用者:
#1.create user 'test1' identified by 'admin'; //注意:使用者名和密碼要交引号,為什麼->>字元串
注意下面的:create user 'test2'@localhost identified by 'admin';
這兩句有什麼差別呢?
有localhost辨別的代表該使用者隻能在本地連接配接mysql資料庫,而不能通過遠端連接配接。不帶localhsot的可以通過遠端連接配接mysql資料庫。
顯著的差別就是在user表的Host字段一個是localhost一個是%
這時我們用test1使用者連接配接mysql,發現成功連接配接,用指令show databases 發現隻有information_schema這個資料庫,為什麼會有這個資料庫呢??
information_schema資料庫是MySQL自帶的,它提供了通路資料庫中繼資料的方式。什麼是中繼資料呢?中繼資料是關于資料的資料,
如資料庫名或表名,列的資料類型,或通路權限等。有些時候用于表述該資訊的其他術語包括“資料詞典”和“系統目錄”。在MySQL中,
把 information_schema 看作是一個資料庫,确切說是資訊資料庫。其中儲存着關于MySQL伺服器所維護的所有其他資料庫的資訊。
如資料庫名,資料庫的表,表欄的資料類型與通路權限等。在information_schema中,有數個隻讀表。它們實際上是視圖,而不是基本表,
是以,你将無法看到與之相關的任何檔案。
我們用root使用者檢視一下發現在user表中的權限全是N,也就是說什麼都做不了。
這時給使用者授予權限:grant seelct ,update on *.* to test1;
## *.*:第一個*代表資料庫,第二個*代表表,是以*.*就是所有資料庫的所有表。
這時會發現user表的select_priv和update_priv字段的值變為了Y。
這時再用test1使用者連接配接mysql資料庫,show database ,發現所有的資料庫都可以檢視和更新了。
#2.這時我們再給test2授權:grant select ,update on mysql.* to test2; //隻能查詢和更新mysql的所有表。
這時就會發現user表中使用者test2的所有權限都是N,而db表中test2使用者對mysql資料庫的select_priv和update_priv的值為Y。
下面tables_priv表,和columns_priv表的權限由自己分析。
經過以上分析,我們對mysql的權限有了更深一點的認識。
四:mysql日志
mysql日志有四種:
#1.二進制檔案:以二進制的形式記錄了資料庫中的操作,但不記錄查詢語句
#2.錯誤日志:記錄mysql的啟動,關閉和運作錯誤等資訊,預設開啟且無法停止
#3.通用查詢日志:記錄使用者登入和記錄查詢的資訊
#4.慢查詢日志:記錄查詢時間超過指定時間的操作
預設情況下,隻開啟了錯誤日志的功能,其餘的根據需要管理者設定
##使用二進制日志還原資料庫
因為二進制檔案存儲更新資料庫的語句,是以可以用來還原資料庫
mysqlbinlog filename.number | mysql -uroot -p //mysqlbinlog 用于打開二進制檔案
使用mysqlbinlog進行還原資料庫時,必須是編号(number)小的先還原。
五:性能優化
#1.性能參數:
show status ; //查詢mysql的性能參數
show status like 'value' ; //檢視某一參數
常用參數介紹如下:
Connections:連接配接mysql伺服器的次數
Uptime:mysql伺服器的上線時間
Slow_queries:慢查詢的次數
Com_select:查詢操作的次數
Com_insert:插入操作的次數
Com_update:更新操作的次數
Com_delete:删除操作的次數
#2.優化查詢
##2.1用explain和describe分析查詢語句
注使用索引查詢記錄時,一定要注意索引的使用情況 ->>見上面使用索引的注意事項
我們将上面用過的explain來分析
explain select * from student where num=2;
執行結果如下:
1.id :select語句的編号
2.select_type:select語句的類型
#simple:簡單查詢,不包含連接配接查詢和子查詢 #primary:主查詢或最外層的查詢語句 #union:連接配接查詢的第二個或後面的查詢語句
2.table:查詢的表
4.type:表的連接配接類型
#system:表中隻有一條記錄 #const:表中有多條記錄,但隻從表中查詢一條 #all:對表進行了完整的掃描 #eq_ref:多表連接配接時,後面的表使用了union或者primary key #ref:多表連接配接時,後面使用了普通索引 #unique_subquery:子查詢使用了unique或者primary key #index_subquery:子查詢使用了普通索引 #range:查詢語句給出了查詢範圍 #index:對表中的索引進行了完整的掃描
5.possible_keys:查詢中可能使用的索引
6.key:查詢使用的索引
7.key_len:索引字段的長度
8.ref:表示使用哪個列或常數與索引一起查詢記錄
9.rows:查詢的行數
10:extra:查詢附加資訊
describe 語句使用方法和explain一樣。
##2.2 優化子查詢
多用連接配接查詢來代替子查詢 為什麼呢? 因為子查詢時,mysql需要為内層查詢結果建立一個臨時表,然後外層查詢在臨時表中查找,查詢完後需要撤銷臨時表。 而連接配接查詢不需要建立臨時表,是以比子查詢快。
##2.3優化插入記錄的速度
插入記錄時,索引,唯一性校驗等都會影響到插入記錄的速度。而且,一次插入多條記錄和多次插入記錄所耗費的時間也不同。
1.禁用索引
插入資料時,mysql會根據表的索引對插入的記錄進行排序,降低插入速度。解決這個問題可以在插入記錄之前禁用索引,等到插入完畢後在開啟。 alter table 表名 disable keys; //禁用索引 alter table 表名 enable keys; //開啟索引 2.禁用唯一性檢查
插入資料時,mysql會對插入的記錄進行唯一性檢查,會降低插入速度。 set unique_checks=0; //禁用唯一性 set unique_checks=1; //開啟唯一性
3.優化insert語句
insert into 表名 values (......), (......);
insert into 表名 values (......); insert into 表名 values (......);
上面兩種插入方法,第一種與資料庫的連接配接等操作,明顯比第二種快。
##2.3分析表,檢查表和優化表
分析表:分析關鍵字的分布 檢查表:檢查表是否存在錯誤 優化表:消除删除或者更新造成的空間浪費 當執行下面三個操作時,mysql資料庫會給表加一個隻讀鎖,隻能讀取記錄,不能更新和插入記錄。
1.分析表 analyze table 表名1 [,表名2....];
2.檢查表 check table 表名1 [,表名2....] [option]; option有五個參數:quick,fast,changed,medium,extended ->>執行效率依次降低 -->option選項隻對MyISAM類型的表有效。
3.優化表 optimize table 表名1 [,表名2....]; -->隻能優化表中的varchar,blob和text字段 如果一個表使用了text或blob這樣的資料類型,那麼更新,删除等就會造成的磁盤空間的浪費。操作完成後,以前配置設定的磁盤空間不會自動回收。 使用optimize可以将磁盤碎片整理出來,以便利用。
下面是一些mysql基本使用指令。
一:mysql檢視基本指令
(1):檢視目前有哪些資料庫
show databases;
(2):使用mysql資料庫
use test;
(3):檢視目前資料庫下的表
show tables;
(4):檢視上述grade表建立的指令
show create table grade;
(5):檢視student表的結構
desc student;
(6):檢視資料庫支援的存儲引擎
show engines;
show engines \G ; // \G讓結果更美觀
(7):檢視預設存儲引擎
show variables like 'storage_engine';
二:mysql的修改表
(1)将grade表的course字段的資料類型修改為varchar(20)
alter table grade modify course varchar(20);
(2)将s_num字段的位置改到course前面
alter table grade modify s_num int(10) after id;
(3)将grade字段改名為score
alter table grade change grade score varchar(10);
(4)删除grade的外鍵限制
alter table grade drop foreign key grade_fk;
(5)将grade的存儲引擎修改為INnoDB
alter grade engine=INnoDB;
(6)将student的address字段删除
alter table student drop address;
(7)在student表中增加名位phone的字段
alter table student add phone int (10);
(8)将grade的表名修改為gradeinfo
lter table grade rename gradeinfo;
(9):删除student表
drop table student; //由于先前已經删除外鍵,是以才能删除父表studnet