Mysql 基礎課二:存儲引擎和使用

存儲引擎

  1. 存儲引擎是表級屬性,在創建表時指定;

  2. MyISAM ,不支持事務,外鍵,沒有行鎖,優點是訪問速度快,適合於多 select,insert into 操作的弱事務性的應用中,單個MyISAM表實際上由.frm(表定義文件),.MYD(表數據文件),.MYI(表索引文件)三個文件構成;

  3. InnoDB,支持行鎖,事務和外鍵,是建表的默認引擎,

  4. MEMORY,表數據是存儲在內存中,性能最好,但 Mysql 實例重啓,數據會丟失;

  5. MERGE,是一組 MyISAM 表的組合,查詢,刪除,更新都是對內部的 MyISAM表 的操作,插入操作需要指定表,通常用來突破對單個MyISAM的限制;

  6. MyISAM 和 InnoDB 默認使用 b-tree 的索引結構,而 MEMORY 默認使用 hash 結構的索引,hash 結構的索引,等值查找非常快,但範圍查找,需要走全表掃描,b-tree 索引,等值查找,時間複雜度是 O(log2N),範圍查找也可以用到索引;

Mysql 基礎知識

  1. information_schema,是系統自帶的庫,存放一些數據庫元信息
	// 例如,查詢數據庫 test1 下所有前綴爲 tmp 的表:
    select table_name from tables where table_schema='test1' and table_name like 'tmp%';
  1. 常用 sql 語句:
	// 選擇數據庫使用
	use db1        
	// 顯示當前數據庫所有的表,顯示所有數據庫               
	show tables 
	show databases
	// 顯示 tb1 的表結構 
	desc tb1 
	// 顯示建表的 sql 語句
	show create table tb1 
  1. 字段數據類型:
    整數類型:TINYINT,SMALLINT,MEDIUMINT,INT(4字節),BIGINT(8字節)等,
    	可指定字段寬度,INT(10),表示1最小長度是 10,可設置 zerofill,表示不足用0填充
    浮點數類型:FLOAT,DOUBLE,取值都是 45 入;
    定點數:DEC,默認精度和標度是 DEC(100)
    	定點數都可以用(M,D)表示,M 表示數字位數,D 表示小數點後的位數,超過是直接截取
    	精度要求高的場景,建議使用定點數
    
	CHAR(M),VARCHAR(M):表示定長和非定長的字符串,M 定義了最大長度,存儲時,CHAR 是固定 M 長度,VCHAR 不固定
    	檢索的時候其中CHAR(M)會去除右邊多餘的空格,而VARCHAR(M)會保留右邊的空格;
    	建議 MyISAM 引擎,使用 char,而 InnoDB引擎,使用 varchar,
    	對於 memory 引擎,char 和 varchar 都會按照 char 處理
    	create table t1(vc varchar(4), c char(4));
    	insert into t1 values('ab  ','ab  ');
        select length(vc),length(c) from t1; 
        4  2
   
	時間字段:DATE,DATETIME(只跟插入時的時區相關),TIME,TIMESTAMP(插入和查詢時都受時區影響),YEAR
    	create table tb1( time1 datetime ,time2 timestamp );
        insert into tb1(time1,time2) values(now(),now());
        set time_zone = '+9:00';
        selct * from tb1;  
        2007-09-25 18:26:50(查詢時東九區的時間)和 2007-09-25 17:26:50(插入時東八區的時間)
    	並且數值,字符串均可插入到時間字段
        insert into table1(date) values(20170725115520) 或者 values('20170725115620')
        	或者 value('2017-07-25 11:56:20');   
  	
  	二進制字節存儲:BINARY(M),VARBINARY(M)
  	枚舉類型:ENUM,SET
  	大容量字段: TEXT,BLOB,其中 text 只能存儲字符數據
  1. 常用函數:
	字符串函數:
    	TRIM(str):去除空格,SUBSTRING(str,x,y):從x 位置起截取 y 長度	
		LEFT(str,len)RIGHT(str,len):從左,從右,截取 len 長度
		STRCMP(s1,s2):比較字符串的 ASCII 大小
	數值函數:
    	CEIL(x):向上取整
    	TRUNCATE(x,y):截斷 x 爲 y 位小數
    	ROUND(x,y):將 x 四捨五入,保留 y 位小數
	日期函數:
    	CURDATE():當前日期
    	CURTIME():當前時間
    	NOW():當前日期和時間
    	DATE_FORMAT(date,fmt):按 fmt 格式化日期 date
    		如:select date_format(now(),'%Y%m%d %T')
    		20170904 14:52:00
    	DATE_ADD(date,INTERVAL expr type):返回date加上一個時間間隔的日期;
    	DATEDIFF(expr,expr2):返回expr2到expr間隔天數;
	流程函數:
    	IF(value,t,f)
    	IFNULL(val1,val2):如果 val1 不爲 null 返回val1,如果 val1 爲 null 返回 val2;
    	CASE WHEN ... THEN ... ELSE ... END; 
    	CASE expr WHEN val THEN ... ELSE ... END;
 	MD5(str)INET_ATON(ip),INET_NTOA(num):ip和數字之間的轉換,方便ip的比較;
 	USER(),VERSION(),DATABASE();

常用 sql 語句

  1. 修改表結構語句:
	alter table tname modify cname ctype   
	alter table tname drop   cname ctype    
	alter table tname change cname1 cname2 ctype    
	// 刪除表中數據,保留表結構,並且新增是從刪除的遞增id開始
	truncate table tname        
  1. 建立表的外鍵,是指從表的外鍵字段,關聯到主表的某唯一列,這樣從表的外鍵字段,必須在主表的關聯字段中取值;在一對一關係中,主表和從表沒有區分,在一對多關係中,一是主表,多是從表,在多對多的關係中,需要建立中間表;
	// table2_cname爲主表
	mysql的這種外鍵不會生效,mysql需要用表級約束來創建外鍵
	create table tname{
	    cname1 ctype,
	    cname2 ctype,
	    foreign key(cname2) references tname2(table2_cname)
	}
	// 如果想定義刪除主表記錄時也將從表外鍵關聯的記錄也刪除或置空,可以使用
	foreign key(cname2) references tname2(table2_cname) on delete set null
	foreign key(cname2) references tname2(table2_cname) on delete cascade
  1. like 條件,% 匹配任意字符任意次數,_ 匹配任意字段單次,convert 函數,用於數據類型轉換,count 函數,如果是字段會忽略 null 的記錄,如果是 count(星) 就包含 null 的記錄;特殊的函數,ifnull(exp1,exp2),case condition when …end;

  2. group by,where 和 having 子句同時出現,首先執行 where 篩選,得到的結果集按 group by 進行分組,最後使用 having 進行分組後的過濾;

  3. 子查詢

	//  >any 表示大於其中任何一個值即可,>all 表示需要大於所有值
	select * from table1 where table1_cname  > any(select table2_cname from table2) 
  1. 連接 join 操作,left join 表示,無論左表是否有匹配,全量輸出,right join 相反,inner join 表示,只輸出匹配的記錄,而 outer join 表示,左右表,無論是否匹配,都會全量輸出;

  2. 觸發器,是指定義在 insert,update,delete 操作前後,執行的一些操作;information_schema 庫的表 triggers 保存了該庫的所有觸發器信息;

like 和 regexp

  1. 關鍵字 Like,% 匹配任意零或多個字符,不會匹配 null,_ 匹配單個字符,默認是不區分大小寫,注意,Like “1000” 是不會查出值爲1000的行;

  2. 關鍵字 Regexp,正則匹配,默認不區分大小寫,添加 binary,讓其區分大小寫,+ 代表1次或多次匹配,* 代表0次或多次匹配,?代表0次或1次匹配;

視圖操作

  1. information_schema 庫的表 views 保存了該庫的所有視圖信息

  2. 存儲過程,是指一段 sql 語句的集合,將邏輯判斷,計算過程轉移到數據庫服務器,但要注意不能給數據庫服務造成過大壓力,information_schema 庫的表 routines 保存了該庫的所有存儲過程信息;

  3. 事件調度器,每隔一段時間執行的邏輯

	// 每 5 s 插入 test 表一條數據
	create event test_event on schedule every 5 second do insert into test.test(id,create_time) values('test',now());

Mysql 的權限管理

  1. 創建用戶,命令 create user ‘userName’@‘ip’ identified by ‘password’,Mysql 使用 用戶名 + ip 來表示一個用戶, mysql.user 表記錄了用戶信息,內存中數組 acl_users 記錄了全局權限; mysql.db 表記錄基於庫的權限,在內存裏,保存在數組 acl_dbs 中,更細的還有表的權限和列的權限 mysql.tables_priv,mysql.columns_priv;

  2. grant 命令用於給用戶賦權,revoke 命令用戶收回權限;flush privileges 語句,是用數據表的數據重建一份內存權限數據,通常在直接使用了 DML 操作了數據表,導致不一致才使用;

	grant all privileges on *.* to 'ua'@'%' with grant option;
	revoke all privileges on *.* from 'ua'@'%';
  1. grant 語句會同時修改數據表和內存,判斷權限的時,使用的是內存數據,並且對已建立的 session 是不生效的;

windows 安裝

  1. 下載社區版,zip 免安裝,解壓即可,環境變量 PATH 增加 /bin,執行 mysqladmin --version 查看,下載地址:https://dev.mysql.com/downloads/mysql/;

  2. 新建 data 文件夾,cmd 中執行 mysqld --initialize (–secure --user=mysql)來初始化 data 目錄,不生成隨機密碼,進入數據庫後,通過 set Password(‘dengh’) 來設置;

  3. zip 解壓目錄,新建 my.ini 配置文件,安裝 mysql 服務,在安裝目錄 /bin,管理員運行 cmd,執行 mysqld install( mysqld remove 移除服務),執行 net start mysql 啓動mysql 服務( net stop mysql 停止 mysql 服務),通過 data/hostname.err 查看啓動日誌;

  4. 連接數據庫,mysql -u root -p(mysql -h127.0.0.1 -P3306 -uroot -p來連接遠程數據庫),更多參考:https://blog.csdn.net/mhmyqn/article/details/17043921

  5. my.ini 配置文件:

	[client]
	    port=3306
	    default-character-set=utf8
	[mysqld]
	    port=3306
	    character_set_server=utf8
	    #解壓目錄
	    basedir=E:\devTools\mysql-5.7.15-winx64\mysql-5.7.15-winx64\
	    #解壓目錄下data目錄
	    datadir=E:\devTools\mysql-5.7.15-winx64\mysql-5.7.15-winx64\data
	    sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
	    skip-grant-tables
	[WinMySQLAdmin]
	    E:\devTools\mysql-5.7.15-winx64\mysql-5.7.15-winx64\bin\mysqld.exe
  1. 如果重複安裝某個數據庫,可能因爲註冊表中沒有刪除乾淨,導致下次安裝不成功,可以嘗試通過 CCleaner 來清除註冊表;

修改 mysql 密碼

  1. 使用 set password 命令,或者使用 mysqladmin,或者直接 update 更新 user 表 ;
	set password for user@ip = password('新密碼');  
	set password for root@localhost = password('123');  

	mysqladmin -u用戶名 -p舊密碼 password 新密碼  
	mysqladmin -uroot -p123456 password 123  

	use mysql;  
	update user set password=password('123') where user='root' and host='localhost';  
	flush privileges; 	
  1. 如果忘記 root 密碼的時候,先跳過權限認證,修改 user 表的密碼;
	1. 關閉正在運行的 MySQL 服務,在 mysql\bin 目錄 cmd 執行 mysqld --skip-grant-tables,意思是啓動 MySQL 跳過權限認證;  
	2. 重新到 mysql\bin 目錄cmd ,執行 mysql,連接權限數據庫 use mysql,修改 user 表密碼  
	3. update user set password=password("123") where user="root";
	4. 並刷新權限:flush privileges; 退出 quit  
	5. 最後就可以使用 root 和設置的新密碼登錄

Tips

  1. myISAM 對錶總數有緩存,innodb 沒有該緩存;

  2. sql 中字符串,使用單引號;

  3. Mysql 中 null 值和任何值都不相等,所以 unique 約束字段,可以有多個 null;

  4. 主鍵,外鍵和唯一約束,都會自動添加索引;

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