《MySQL 深入淺出》 1-17章節 閱讀整理

maohaiqing0304發表於2015-05-04


標題: 《MySQL 深入淺出》 1-17章節 閱讀整理 

作者:lōττéry©版權所有[文章允許轉載,但必須以連結方式註明源地址,否則追究法律責任.]



**  以下提到oracle部分只是對比
擴充套件,本文重點是 《MySQL 深入淺出》書中1-17章節 個人覺得需要提筆一記的知識點整理。
**  該書講解  VERSION() ==>’5.0.18-nt‘ ,預設引擎 : MyISAM
1、獲取建表語句   
     mysql --&gt show create table emp \G;
     oracle --&gt SELECT DBMS_METADATA.GET_DDL ('TABLE', '表名',user ) FROM DUAL;
2、一條insert 多行value值
     mysql --&gt insert into table(id,name) values (1,'a'),(2,'b'),(3,'c'); 
     oracle --&gt insert into table(id,name) select 1,'a' from dual union all select 2,'b' from dual  union all select 3,'c' from dual ; 或者寫多條insert語句;
3、限制/範圍 行數
     mysql --&gt limit [offset_start,row_count]   offset_start 表示記錄的起始偏移量{預設0},row_count 表示顯示的行數
     oracle --&gt rownum = n        Oracle rownum 分頁引起的效率問題及最佳化思路
4、更改表欄位和表名字:
     改欄位名:
     oracle:alter table emp rename column age to age1; 
     mysql :alter table emp change age age1 int (4) ;
            oracle、mysql modify 都不能需要欄位名稱。
     改表名字:oracle 和mysql 都是用rename emp to emp1或者 alter table emp rename to emp1 實現.
5、執行sql/儲存 有警告/報錯時  檢視warning/error 詳細資訊
     mysql --&gt show warnings;  
     oracle --&gt "SQL>show errors" 、 OS層$ oerr ora 00922
6、表結構設定 id int(5) zerofill 屬性,  再insert  1111111位數為 7  不會報錯,因為zerofill後,寬度格式限制失效,且也不會有填充0部分.
7、欄位雷系TIMESTAMP(tm ),增加時,系統會自動給第一個timestamp欄位 授予預設值 CURRENT_TIMESTAMP(系統日期),且可以直接寫定製19700101080001數字形式 ....
8、now()函式 代表當前日期 
9、year 年份部分  00 "到"69" 範圍的值被轉換為 2000~2069 範圍的 YEAR 值     、"70" 到“99”範圍的值被轉換為 1970~1999 範圍的 YEAR 值
10、mysql 3中註釋符
1)#內容
2)/*內容*/;
3)-- 內容  (提示--後要有空格) 
11、 mysql 透過命令直接執行語句

[root@lottery ~]# mysql -uroot -p11  -N -e "use diamond; show tables;"

+-------------+

| config_info |

+-------------+

[root@lottery ~]#  

-e 後面跟上要執行的 SQL語句

-N 引數是不顯示錶頭  

25章有詳細介紹。

--------------------------------------------------------------以上為小知識點,小筆記------------------------------------------------------------------------------------------------------ 
一、 
MySQL 中的字元型別   
字串型別 描述及儲存需求
CHAR ( M) M 為 0 ~ 255 之間的整數
VARCHAR ( M) M 為 0 ~ 65535 之間的整數,值的長度 +1 個位元組
TINYBLOB 允許長度 0 ~255 位元組,值的長度 +1 個位元組
BLOB 允許長度 0 ~65535 位元組,值的長度 +2 個位元組
MEDIUMBLOB 允許長度 0 ~167772150 位元組,值的長度 +3 個位元組
LONGBLOB 允許長度 0 ~4294967295 位元組,值的長度 +4 個位元組
TINYTEXT 允許長度 0 ~255 位元組,值的長度 +2 個位元組
TEXT 允許長度 0 ~65535 位元組,值的長度 +2 個位元組
MEDIUMTEXT 允許長度 0 ~167772150 位元組,值的長度 +3 個位元組
LONGTEXT 允許長度 0 ~4294967295 位元組,值的長度 +4 個位元組
VARBINARY(M)    
允許長度 0 ~M 個位元組的變長位元組字串,值的長度 +1 個位元組
BINARY ( M) 允許長度 0 ~M 個位元組的定長位元組字串

char 和varchar  型別 
char(2)  
      insert '1'  oracle資料庫 length=2,mysql資料庫 length=1,
      insert '1空格'  oracle length=2,mysql=1 
varchar(2)  
      insert '1' oracle  length=1,mysql=1 ,
      insert '1空格' oracle length=2,mysql=2


二、
第四章 、MySQL 中的運算子
算術運算子
運算子  作用 
加法 
減法 
乘法 
/,DIV  除法,返回商 
%,MOD  除法,返回餘數 
MySQL 支援的比較運算子 
運算子  作用 
等於 
<>或!=  不等於 
<=>  NULL 安全的等於(NULL-safe) 
小於 
<=  小於等於 
大於 
>=  大於等於 
BETWEEN  存在與指定範圍 
IN  存在於指定集合 
IS NULL  為 NULL 
IS NOT NULL  不為 NULL 
LIKE  萬用字元匹配 
REGEXP 或 RLIKE  正規表示式匹配 
MySQL 中的邏輯運算子 
運算子  作用 
NOT 或!  邏輯非 
AND 或&&  邏輯與 
OR 或 ||  邏輯或 
XOR  邏輯異或 
MySQL 支援的位運算子 
運算子  作用 
位與(位 AND) 
位或 (位 OR ) 
位異或(位 XOR) 
位取反 
>>   位右移 
< 位左移 
MySQL 中的運算子優先順序 
運算子  優先順序順序 
:=  1
||, OR, XOR  2
&&, AND  3
NOT  4
BETWEEN, CASE, WHEN, THEN, ELSE  5
=, <=>, >=, >, <=, , !=, IS, LIKE, REGEXP, IN  6
7
8
<>  9
-, +  10
*, /, DIV, %, MOD  11
12
- (一元減號), ~ (一元位元反轉)  13
14
*** 實際上,我們都是用 () 來將需要優先的操作括起來,既起到優先作用也方便看.



三、 
第五章 、MySQL常用函式
MySQL 中的常用字串函式 

函式  功能   
CANCAT(S1,S2,…Sn)  連線 S1,S2,…Sn 為一個字串   
INSERT(str,x,y,instr)  將字串 str 從第 x 位置開始,y 個字元長的子串替換為字串 instr   
LOWER(str)  將字串 str 中所有字元變為小寫   
UPPER(str)  將字串 str 中所有字元變為大寫   
LEFT(str ,x)  返回字串 str 最左邊的 x 個字元   
RIGHT(str,x)  返回字串 str 最右邊的 x 個字元   
LPAD(str,n ,pad)  用字串 pad 對 str 最左邊進行填充,直到長度為 n 個字元長度   
RPAD(str,n,pad)  用字串 pad 對 str 最右邊進行填充,直到長度為 n 個字元長度   
LTRIM(str)  去掉字串 str 左側的空格   
RTRIM(str)  去掉字串 str 行尾的空格   
REPEAT(str,x)  返回 str 重複 x 次的結果   
REPLACE(str,a,b)  用字串 b 替換字串 str 中所有出現的字串 a   
STRCMP(s1,s2)  比較字串 s1 和 s2   
TRIM(str)  去掉字串行尾和行頭的空格   
SUBSTRING(str,x,y)  返回從字串 str x 位置起 y 個字元長度的字串   
MySQL 中的常用數值函式 

函式  功能   
ABS(x)  返回 x 的絕對值   
CEIL(x)  返回大於x的最大整數值   
FLOOR(x)  返回小於 x 的最大整數值   
MOD(x,y)  返回 x/y 的模   
RAND()  返回 0 到 1 內的隨機值   
ROUND(x,y)  返回引數 x 的四捨五入的有 y 位小數的值   
TRUNCATE(x,y)  返回數字 x 截斷為 y 位小數的結果   
MySQL 中的常用日期時間函式 

函式  功能   
CURDATE()  返回當前日期   
CURTIME()  返回當前時間   
NOW()  返回當前的日期和時間   
UNIX_TIMESTAMP(date)  返回日期 date 的 UNIX 時間戳   
FROM_UNIXTIME  返回 UNIX 時間戳的日期值   
WEEK(date)  返回日期 date 為一年中的第幾周   
YEAR(date)  返回日期 date 的年份   
HOUR(time)  返回 time 的小時值   
MINUTE(time)  返回 time 的分鐘值   
MONTHNAME(date)  返回 date 的月份名   
DATE_FORMAT(date,fmt)   返回按字串 fmt 格式化日期 date 值   
DATE_ADD(date,INTERVAL expr type)  返回一個日期或時間值加上一個時間間隔的時間值   
DATEDIFF(expr,expr2)  返回起始時間 expr 和結束時間 expr2 之間的天數 
MySQL 中的日期時間格式 

格式符  格式說明   
%S,%s   兩位數字形式的秒(00,01,...,59)   
%i   兩位數字形式的分(00,01,...,59)   
%H  兩位數字形式的小時,24 小時(00,01,...,23)   
%h,%I   兩位數字形式的小時,12 小時(01,02,...,12)   
%k   數字形式的小時,24 小時(0,1,...,23)   
%l  數字形式的小時,12 小時(1,2,...,12)   
%T   24 小時的時間形式(hh:mm:ss)   
%r  12 小時的時間形式(hh:mm:ssAM 或 hh:mm:ssPM)   
%p   AM 或 PM   
%W   一週中每一天的名稱(Sunday,Monday,...,Saturday)   
%a  一週中每一天名稱的縮寫(Sun,Mon,...,Sat)   
%d  兩位數字表示月中的天數(00,01,...,31)   
%e  數字形式表示月中的天數(1,2,...,31)   
%D   英文字尾表示月中的天數(1st,2nd,3rd,...)   
%w  以數字形式表示週中的天數(0=Sunday,1=Monday,...,6=Saturday)   
%j  以3位數字表示年中的天數(001,002,...,366)   
%U  周(0,1,52),其中 Sunday 為週中的第一天   
%u  周(0,1,52),其中 Monday 為週中的第一天   
%M   月名(January,February,...,December)   
%b  縮寫的月名(January,February,...,December)   
%m  兩位數字表示的月份(01,02,...,12)   
%c  數字表示的月份(1,2,...,12)   
%Y  4位數字表示的年份   
%y  兩位數字表示的年份   
%%  直接值“%”   
MySQL 中的日期間隔型別 

表示式型別  描述  格式 
HOUR  小時  hh 
MINUTE  分  mm 
SECOND  秒  ss 
YEAR  年  YY 
MONTH  月  MM 
DAY  日  DD 
YEAR_MONTH  年和月  YY-MM 
DAY_HOUR  日和小時  DD hh 
DAY_MINUTE  日和分鐘  DD hh:mm 
DAY_ SECOND  日和秒  DD hh:mm:ss 
HOUR_MINUTE  小時和分  hh:mm 
HOUR_SECOND  小時和秒  hh:ss 
MINUTE_SECOND  分鐘和秒  mm:ss 
MySQL 中的流程函式 

函式  功能   
IF(value,t f)  如果 value 是真,返回 t;否則返回 f   
IFNULL(value1,value2)  如果 value1 不為空返回 value1,否則返回 value2   
CASE WHEN [value1]  如果 value1 是真,返回 result1,否則返回 default   
THEN[result1]…ELSE[default]END   
CASE [expr] WHEN [value1]  如果 expr 等於 value1,返回 result1,否則返回 default   
THEN[result1]…ELSE[default]END   
MySQL 中的其他常用函式 

函式 功能   
DATABASE()  返回當前資料庫名   
VERSION()  返回當前資料庫版本   
USER()  返回當前登入使用者名稱   
INET_ATON(IP)  返回 IP 地址的數字表示   
INET_NTOA(num)  返回數字代表的 IP 地址   
PASSWORD(str)  返回字串 str 的加密版本   
MD5()  返回字串 str 的 MD5 值 

第17章 正規表示式中的模式   
** 和上文函式可一起使用特此一起記錄
序列  序列說明
在字串的開始處進行匹配 
在字串的末尾處進行匹配 
匹配任意單個字元,包括換行符 
[…]  匹配出括號內的任意字元 
[^…]  匹配不出括號內的任意字元 
a*   匹配零個或多個 a(包括空串) 
a+  匹配 1 個或多個 a(不包括空串) 
a?  匹配 1 個或零個 a 
a1|a2  匹配 a1 或 a2 
a(m)  匹配 m 個 a 
a(m,)  匹配 m 個或更多個 a 
a(m,n)  匹配 m 到 n 個 a 
a(,n)  匹配 0 到 n 個 a 
(…..) 將模式元素組成單一元素

 

四、
第6章   圖形化工具的使用 
提供的功能包括 啟動關閉資料庫、連線管理、健康檢查、備份管理、Catalogs 管理、使用者管理、引數配置、資料庫物件管理、備份恢復管理等
1)連線管理:檢視當前活躍的資料庫連線,  與 SHOW PROCESSLIST 命令的執行結果相同
2)健康檢查  :資料庫連線的變化情況、SQL 查詢執行的數量、緩衝區的命中率等
3)備份管理 
備份執行方法的選項進行說明。 
? InnoDB Online Backup:為了確保 InnoDB 表備份結果的資料的一致性,會在備份開始的時候啟動一個事務,推薦只在備份 InnoDB 型別的表時使用。 
? Lock all tables:為了確保 MyISAM 表備份結果的資料的一致性,會在備份開始時對本次要備份的表執行 Lock 操作,防止新的資料寫入。這樣在備份期間會阻塞表的更新,對於更新密集型的應用要謹慎選擇使用這個選項。 
? Online with binlog pos:除了實現和 InnoDB Online Backup 相同的功能外,還記錄了當前 Binlog 的位置,便於恢復時知道需要恢復的 Binlog 的起點。 
? Normal backup:只在備份每個表的時候才鎖定該表,這種情況下對應用的影響是最小的,但是相應的這種備份方法生成的備份結果中,表間的資料一致性是最沒有保障的,選擇這種備份方式前要考慮到這個問題,透過選擇合適的時間執行備份操作來減小備份資料不一致的風險。 
? Complete backup:選定資料庫的全備份,而忽視前面選擇的表的列表。這種方式對於資料庫中的表定期增加的情況非常有用,省去每次修改備份列表的工作
注意:控制檯的備份管理提供的選項比命令列少很多,例如不能指定匯出字符集,不能指定匯出記錄的 WHERE 條件,也不能按照指定的分隔符和換行符匯出資料成文字檔案。所以如果使用者需要更高階的資料備份功能,還是要熟練掌握 mysqldump 的各個命令列引數
4)Catalogs
控制檯提供的管理表、索引、檢視和過程的工具。可以用來查詢和修改已有的資料庫物件或者建立新的資料庫物件,取決於連線的使用者所擁有的許可權。=> 類似SHOW TABLE STATUS 命令列顯示 , show table status 類似oracle的user_tables 裡的(rows,data_length,max_data_length,comment等)
注意:對分割槽的支援還不是很好,新建/修改分割槽表,都沒有可以指定分割槽特性的地方,所以如果你需要建立和維護分割槽表,那麼暫時還只能透過命令列來建立。
5)MySQL Query Brower 提供的工具包括資料的查詢、更新和 SQL 的最佳化分析,雖然對於 MySQL Query Brower 提供的大多數功能,用字元介面的 MySQL 客戶端都可以實現,但是相比之下, Query Brower 返回的結果更直觀,在查詢的列非常多的時候不會因為內容換行而使結果看起來很讓人困惑。此外,對於查詢的返回結果,可以選擇匯出成 XML、HTML、EXCEL、CVS 等多種格式,相比命令列的方式更靈活和方便。 
6)phpMyAdmin(簡稱 PMA)
一個用 PHP 編寫的、可以透過 Web 控制和操作 MySQL 資料庫的工具,功能非常全面,包括資料庫管理、資料物件管理、使用者管理、資料匯入匯出、資料庫管理、資料管理等


 
五、 
第7章   表型別(儲存引擎)的選擇 
1) MySQL 5.0 支援的儲存引擎包括 MyISAM/InnoDB/BDB/MEMORY/MERGE/EXAMPLE/NDB/Cluster/
ARCHIVE/CSV/BLACKHOLE/FEDERATED 等,其中 InnoDB 和 BDB 提供事務安全表,其他儲存引擎都是非事務安全表。 
2) 檢視mysql當前預設的儲存引擎:
show variables like '%storage_engine%';
3) 查詢當前資料庫支援的儲存引擎的2種方式。
1.
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| CSV                      | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
mysql>
2.  SHOW VARIABLES LIKE 'have%';   
4) 更改表的儲存引擎:
 alter table table_name engine = innodb; 
5) 常用儲存引擎的對比           
特點  MyISAM  InnoDB  MEMORY  MERGE  NDB 
儲存限制  有  64TB  有  沒有  有 
事務安全    支援       
鎖機制  表鎖  行鎖  表鎖  表鎖  行鎖 
B 樹索引  支援  支援  支援  支援  支援 
雜湊索引      支援    支援 
全文索引  支援         
叢集索引    支援       
資料快取    支援  支援    支援 
索引快取  支援  支援  支援  支援  支援 
資料可壓縮  支援         
空間使用  低  高  N/A  低  低 
記憶體使用  低  高  中等  低  高 
批次插入的速度  高  低  高  高  高 
支援外來鍵    支援       

mysql 非自動提交設定注意事項 (mysql預設是自動提交,根據業務去更改)
若表引擎不是innodb,即使設定=0 ,每執行也都會自動提交; 
若innodb引擎,set auto_commit =1就會自動提交,=0就要手動commit;


InnoDB 表的自動增長列 (關鍵字autoincre_demo)
insert 自動增長列 可以按照自動增長屬性 insert資料 每行+1,也可以手動寫定值,但當定值為 null或者0時,會按照自動增加列的max(id)+1增長.定值部分還是會正常insert.;
例如:若max(id)=300, 執行insert .. values(103,'1'),(0,'2'),(null,'3');  對應insert成的資料為:  (103,'1'),(301,'2'),(302,'3'); 
透過ALTER TABLE *** AUTO_INCREMENT = n; 語句強制設定自動增長列的初識值,預設從 1 開始,
但是該強制的預設值是保留在記憶體中的,如果該值在使用之前資料庫重新啟動,那麼這個強制的預設值就會丟失,就需要在資料庫啟動以後重新設定。
可以使用select  LAST_INSERT_ID()查詢當前執行緒最後插入記錄使用的值。如果一次插入了多條記錄,那麼返回的是第一條記錄使用的自動增長值。下面的例子演示了使用 LAST_INSERT_ID() 的情況: 

MEMORY 儲存引擎
使用存在記憶體中的內容來建立表。每個 MEMORY 表只實際對應一個磁碟檔案,格式是.frm。MEMORY 型別的表訪問非常得快,因為它的資料是放在記憶體中的,並且預設使用 HASH 索引,但是一旦服務關閉,表中的資料就會丟失掉。給 MEMORY 表建立索引的時候,可以指定使用 HASH 索引還是 BTREE 索引:create index 索引名 USING HASH/BTREE on 表(列) ;
每個 MEMORY 表中可以放置的資料量的大小,受到 max_heap_table_size 系統變數的約束,這個系統變數的初始值是 16MB,可以按照需要加大。此外,在定義 MEMORY 表的時候,可以透過 MAX_ROWS 子句指定表的最大行數。



下面是常用儲存引擎的適用環境。
** MyISAM :預設的 MySQL 外掛式儲存引擎。如果應用是以讀操作和插入操作為主,只有很少的更新和刪除操作,並且對事務的完整性、併發性要求不是很高,那麼選擇這個儲存引擎是非常適合的。 MyISAM 是在 Web 、資料倉儲和其他應用環境下最常使用的儲存引擎之一。
** InnoDB :用於事務處理應用程式,支援外來鍵。如果應用對事務的完整性有比較高的要求,在併發條件下要求資料的一致性,資料操作除了插入和查詢以外,還包括很多的更新、刪除操作,那麼 InnoDB 儲存引擎應該是比較合適的選擇。InnoDB 儲存引擎除了有效地降低由於刪除和更新導致的鎖定,還可以確保事務的完整提交( Commit)和回滾(Rollback),對於類似計費系統或者財務系統等對資料準確性要求比較高的系統, InnoDB 都是合適的選擇。
** MEMORY :將所有資料儲存在 RAM 中,在需要快速定位記錄和其他類似資料的環境下,可提供極快的訪問。 MEMORY 的缺陷是對錶的大小有限制,太大的表無法 CACHE 在記憶體中,其次是要確保表的資料可以恢復,資料庫異常終止後表中的資料是可以恢復的。MEMORY 表通常用於更新不太頻繁的小表,用以快速得到訪問結果。
** MERGE :用於將一系列等同的 MyISAM 表以邏輯方式組合在一起,並作為一個物件引用它們。 MERGE 表的優點在於可以突破對單個 MyISAM 表大小的限制,並且透過將不同的表分佈在多個磁碟上,可以有效地改善 MERGE表的訪問效率。這對於諸如資料倉儲等 VLDB 環境十分適合。
注意:以上只是我們按照實施經驗提出的關於儲存引擎選擇的一些建議,但是不同應用的特點是千差萬別的,選擇使用哪種儲存引擎才是最佳方案也不是絕對的,這需要根據使用者各自的應用進行測試,從而得到最適合自己的結果。 


六、
第8章   選擇合適的資料型別 
CHAR 和 VARCHAR 
CHAR 和 VARCHAR 型別類似,都用來儲存字串,但它們儲存和檢索的方式不同。CHAR 屬於固定長度的字元型別,而 VARCHAR 屬於可變長度的字元型別。
CHAR 和 VARCHAR 對比          
值  CHAR(4) 儲存需求  VARCHAR(4) 儲存需求   
''  '    '  4 個位元組  ''  1 個位元組   
'ab'  'ab  '  4 個位元組  'ab '  3 個位元組   
'abcd'  'abcd'  4 個位元組  'abcd'  5 個位元組   
'abcdefgh'  'abcd'  4 個位元組  'abcd'  5 個位元組   
簡單概括 不同的儲存引擎對 CHAR 和 VARCHAR 的使用原則有所不同  。
MyISAM 儲存引擎:建議使用固定長度的資料列代替可變長度的資料列。
MEMORY 儲存引擎:目前都使用固定長度的資料行儲存,因此無論使用 CHAR 或 VARCHAR 列都沒有關係。兩者都是作為 CHAR 型別處理。
InnoDB 儲存引擎:建議使用 VARCHAR 型別。對於 InnoDB 資料表,內部的行儲存格式沒有區分固定長度和可變長度列(所有資料行都使用指向資料列值的頭指標),因此在本質上,使用固定長度的 CHAR 列不一定比使用可變長度 VARCHAR 列效能要好。因而,主要的效能因素是資料行使用的儲存總量。由於 CHAR 平均佔用的空間多於 VARCHAR,因此使用 VARCHAR 來最小化需要處理的資料行的儲存總量和磁碟 I/O 是比較好的。
TEXT 與 BLOB           
TEXT 或者 BLOB用來儲存較大文字;
二者間主要差別是: 
BLOB 能用來儲存二進位制資料,比如照片;
而 TEXT 只能儲存字元資料,比如一篇文章或者日記。
TEXT 和 BLOB 中有分別包括 TEXT、MEDIUMTEXT、LONGTEXT 和 BLOB、MEDIUMBLOB、LONGBLOB3 種不同的型別;
它們之間的主要區別是儲存文字長度不同和儲存位元組不同,使用者應該根據實際情況選擇能夠滿足需求的最小儲存型別。
BLOB 和 TEXT 值會引起一些效能問題,特別是在執行了大量的刪除操作時。 
刪除操作會在資料表中留下很大的“空洞”,以後填入這些“空洞”的記錄在插入的效能上會有影響。為了提高效能,建議定期使用 OPTIMIZE TABLE 功能對這類表進行碎片整理,避免因為“空洞”導致效能問題。

 註釋:OPTIMIZE TABLE會產生鎖表, mysql 空洞類似oracle 高水位,oracle 透過move 等形式解決 

浮點數與定點數
       
float、double(或 real)表示浮點數。 
decimal(或 numberic)表示定點數
注意:在今後關於浮點數和定點數的應用中,使用者要考慮到以下幾個原則:
浮點數存在誤差問題;
對貨幣等對精度敏感的資料,應該用定點數表示或儲存;
在程式設計中,如果用到浮點數,要特別注意誤差問題,並儘量避免做浮點數比較;
要注意浮點數中一些特殊值的處理。


七、
第9章   字符集 
常用字符集比較       
字符集  是否定長  編碼方式  其他說明 
ACSII  是  單位元組 7 位編碼  最早的奠基性字符集 
ISO-8859-1/latin1  是  單位元組 8 位編碼  西歐字符集,經常被一些程式設計師用來轉碼 
GB2312-80  是  雙位元組編碼  早期標準,不推薦再使用 
GBK  是  雙位元組編碼  雖然不是國標,但支援的系統不少 
GB18030  否  2 位元組或 4 位元組編碼  開始有一些支援,但資料庫支援的還少見 
UTF-32  是  4 位元組編碼  UCS-4 原始編碼,目前很少採用 
UCS-2  是  2 位元組編碼  Windows 2000 內部用 UCS-2 
UTF-16  否  2 位元組或 4 位元組編碼  Java 和 Windows XP/NT 等內部使用 UTF-16 
UTF-8  否  1 至 4 位元組編碼  網際網路和UNIX/Linux廣泛支援的Unicode字符集
MySQLServer 也使用 UTF-8 




查詢當前伺服器的字符集和校對規則:
 show variables like 'character_set_server'; 
設定/更換字符集 :
1/ my.cnf中設定:
[mysqld] default-character-set=gbk
2/ 啟動選項中指定:
mysqld --default-character-set=gbk
3/ 在編譯的時候指定:
./configure --with-charset=gbk 

引數:character_set_client、 character_set_connection 和 character_set_results,分別代表客戶端、連線和返回結果的字符集


八、
BTREE 索引與 HASH 索引
兩種不同型別的索引各有其不同的適用範圍。HASH 索引有一些重要的特徵需要在使用的時候特別注意,如下所示。
只用於使用=或<=>運算子的等式比較。
最佳化器不能使用 HASH 索引來加速 ORDER BY 操作。
MySQL 不能確定在兩個值之間大約有多少行。如果將一個 MyISAM 表改為 HASH 索引的 MEMORY 表,會影響一些查詢的執行效率。
只能使用整個關鍵字來搜尋一行。
而對於 BTREE 索引,當使用>、=、<=、BETWEEN、!=或者<>,或者 LIKE 'pattern'(其中'pattern'不以萬用字元開始)運算子時,都可以使用相關列上的索引。
例子:
下列範圍查詢適用於 BTREE 索引和 HASH 索引:
SELECT * FROM t1 WHERE key_col = 1 OR key_col IN (15,18,20);
下列範圍查詢只適用於 BTREE 索引:
SELECT * FROM t1 WHERE key_col > 1 AND key_col < 10;
SELECT * FROM t1 WHERE key_col LIKE 'ab%' OR key_col BETWEEN 'lisa' AND 'simon'; 
view 
使用 CREATE OR REPLACE 或者 ALTER 修改檢視
顯示使用者下多少view  :show tables;
檢視檢視狀態 : show table status like 'staff_list' ;
檢視檢視建立語句: show create view staff_list;
檢視儲存狀態: show procedure status like 'film_in_stock';
檢視儲存建立語句: SHOW CREATE {PROCEDURE | FUNCTION} sp_name ;
透過檢視 information_schema. Routines 瞭解儲存過程和 函式的詳細資訊:
select *  from Routines where ROUTINE_NAME = 'film_in_stock';
***  怎麼寫儲存/函式 一些語法等,語法太多,在此不做說明,若有需要請自己查詢相關資料
第14章   事務控制和鎖定語句 
LOCK TABLE 和 UNLOCK TABLE
LOCK TABLES 可以鎖定用於當前執行緒的表。如果表被其他執行緒鎖定,則當前執行緒會等待,直到可以獲取所有鎖定為止。
UNLOCK TABLES 可以釋放當前執行緒獲得的任何鎖定。當前執行緒執行另一個 LOCK TABLES 時,或當與伺服器的連線被關閉時,所有由當前執行緒鎖定的表被隱含地解鎖
一個獲得表鎖和釋放表鎖的簡單例子 
session_1  session_2 
獲得表film_text的READ鎖定   
mysql> lock table film_text read; 
Query OK, 0 rows affected (0.00 sec) 
當前session可以查詢該表記錄
mysql> select film_id,title from film_text where film_id = 1001;
+---------+------------------+
| film_id | title            |
+---------+------------------+
| 1001    | ACADEMY DINOSAUR |
+---------+------------------+
1 row in set (0.00 sec)
其他session也可以查詢該表的記錄
mysql> select film_id,title from film_text where film_id = 1001;
+---------+------------------+
| film_id | title            |
+---------+------------------+
| 1001    | ACADEMY DINOSAUR |
+---------+------------------+
1 row in set (0.00 sec)
  其他 session 更新鎖定表會等待獲得鎖:
mysql> update film_text set title = 'Test' where film_id =
1001;
等待
釋放鎖
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
等待 
  Session 獲得鎖,更新操作完成:
mysql> update film_text set title = 'Test' where film_id =
1001;
Query OK, 1 row affected (1 min 0.71 sec)
Rows matched: 1  Changed: 1  Warnings: 0




事物控制 : 
MySQL 透過 SET AUTOCOMMIT、START TRANSACTION、COMMIT 和 ROLLBACK 等語句支援本地事務,具體語法如下。
START TRANSACTION | BEGIN [WORK]
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
SET AUTOCOMMIT = {0 | 1}
MySQL 預設是自動提交(Autocommit)的,可用Commit 和 Rollback 來提交和回滾事務,那麼需要透過明確的事務控制命令來開始事務,這是和 Oracle 的事務管理明顯不同的地方。如果應用是從 Oracle 資料庫遷移到 MySQL 資料庫,則需要確保應用中是否對事務進行了明確的管理。
START TRANSACTION 或 BEGIN 語句可以開始一項新的事務。
COMMIT 和 ROLLBACK 用來提交或者回滾事務。
CHAIN 和 RELEASE 子句分別用來定義在事務提交或者回滾之後的操作,CHAIN 會立即啟動一個新事物,並且和剛才的事務具有相同的隔離級別,RELEASE 則會斷開和客戶端的連線.       ? SET AUTOCOMMIT 可以修改當前連線的提交方式,如果設定了 SET AUTOCOMMIT=0,則設定之後的所有事務都需要透過明確的命令進行提交或者回滾。
如果只是對某些語句需要進行事務控制,則使用 START TRANSACTION 語句開始一個事務比較方便,這樣事務結束之後可以自動回到自動提交的方式,如果希望所有的事務都不是自動提交的,那麼透過修改 AUTOCOMMIT 來控制事務比較方便,這樣不用在每個事務開始的時候再執行 START TRANSACTION 語句。

***** 在此只摘取重要說明部分,較多例子在此未作宣告,若想了解請自己查詢相關資料


十、
SQL MODE
MySQL 5.0 上, SQL Mode(sql_mode 引數)預設 為REAL_AS_FLOAT/PIPES_AS_CONCAT/ANSI_QUOTES/GNORE_SPACE 和 ANSI;
在這種模式下允許插入超過欄位長度的值,只是在插入後, MySQL 會返回一個 warning 。透過修改 sql_mode 為 STRICT_TRANS_TABLES(嚴格模式)實現了資料的嚴格校驗,使錯誤資料不能插入表中,從而保證了資料的準確性,具體實現如下。 
檢視預設 SQL Mode 的命令如下: 
mysql> select @@sql_mode; 
sql_mode 的一種修改方法,即 SET [SESSION|GLOBAL] sql_mode='modes',其中 SESSION 選項表示只在本次連線中生效;而 GLOBAL 選項表示在本次連線中並不生效,而對於新的連線則生效,這種方法在 MySQL 4.1 開始有效。另外,也可以透過使用“--sql-mode="modes"”選項,在 MySQL 啟動時設定 sql_mode。

 詳見部落格  MySQL資料型別:SQL_MODE設定不容忽視  
MySQL 中的 SQL Mode 
sql_mode值  描述 
ANSI  等同於 REAL_AS_FLOAT、PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE 和 ANSI
組合模式,這種模式使語法和行為更符合標準的 SQL 
STRICT_TRANS_TABLES  STRICT_TRANS_TABLES 適用於事務表和非事務表,它是嚴格模式,不允許非法日期,也不允許超過欄位長度的值插入欄位中,對於插入不正確的值給出錯誤而不是警告 
 
TRADITIONAL  TRADITIONAL 模式等同於 STRICT_TRANS_TABLES、STRICT_ALL_TABLES、
MySQL 中的常用資料庫 Mode   
組合後的模式名稱  組合模式中的各個sql_mode 
DB2  PIPES_AS_CONCAT 、 ANSI_QUOTES 、 IGNORE_SPACE 、 NO_KEY_OPTIONS
NO_TABLE_OPTIONS、NO_FIELD_OPTIONS 
MAXDB  PIPES_AS_CONCAT 、 ANSI_QUOTES 、 IGNORE_SPACE 、 NO_KEY_OPTIONS
NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、 NO_AUTO_CREATE_USER 
MSSQL  PIPES_AS_CONCAT 、 ANSI_QUOTES 、 IGNORE_SPACE 、 NO_KEY_OPTIONS
NO_TABLE_OPTIONS、 NO_FIELD_OPTIONS 
ORACLE  PIPES_AS_CONCAT 、 ANSI_QUOTES 、 IGNORE_SPACE 、 NO_KEY_OPTIONS
NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、NO_AUTO_CREATE_USER 
POSTGRESQL  PIPES_AS_CONCAT 、 ANSI_QUOTES 、 IGNORE_SPACE 、 NO_KEY_OPTIONS
NO_TABLE_OPTIONS、NO_FIELD_OPTIONS 


在資料遷移過程中,可以設定 SQL Mode 為 NO_TABLE_OPTIONS 模式,這樣將去掉 show create table 中的“engine”關鍵字,獲得通用的建表指令碼。
測試例項如下: 
mysql
 > show create table emp \ G   
CREATE TABLE `emp ` 
(`
ename varchar( 20 ) DEFAULT NULL ) 
ENGINE =InnoDB DEFAULT CHARSET =gbk ;
mysqlset session sql_mode ='NO_TABLE_OPTIONS' ;
mysql >  show create table emp \G 
CREATE TABLE `emp ` (`ename varchar( 20DEFAULT NULL );



從第18章SQL 最佳化開始 往後每章節都需要仔細閱讀書籍和資料。由於知識點過多,所以在此先不做整理。
後續可能會對一些點做整理 另發部落格。



此條目發表在 MySQL 分類目錄。將固定連線加入收藏夾。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28602568/viewspace-1622174/,如需轉載,請註明出處,否則將追究法律責任。

相關文章