《MySQL 深入淺出》 1-17章節 閱讀整理
** 以下提到oracle部分只是對比擴充套件,本文重點是 《MySQL 深入淺出》書中1-17章節 個人覺得需要提筆一記的知識點整理。
** 該書講解 VERSION() ==>’5.0.18-nt‘ ,預設引擎 : MyISAM
1、獲取建表語句
mysql --> show create table emp \G;
oracle --> SELECT DBMS_METADATA.GET_DDL ('TABLE', '表名',user ) FROM DUAL;
2、一條insert 多行value值
mysql --> insert into table(id,name) values (1,'a'),(2,'b'),(3,'c');
oracle --> 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 --> limit [offset_start,row_count] offset_start 表示記錄的起始偏移量{預設0},row_count 表示顯示的行數
oracle --> 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 --> show warnings;
oracle --> "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 透過命令直接執行語句
25章有詳細介紹。
[root@lottery ~]# mysql -uroot -p11 -N -e "use diamond; show tables;"
+-------------+
| config_info |
+-------------+
[root@lottery ~]#
-e 後面跟上要執行的 SQL語句
-N 引數是不顯示錶頭
--------------------------------------------------------------以上為小知識點,小筆記------------------------------------------------------------------------------------------------------
一、
MySQL 中的字元型別 |
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 中的運算子 |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*** 實際上,我們都是用 “()” 來將需要優先的操作括起來,既起到優先作用也方便看.
|
|
三、
第五章 、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章 字符集 | |||||||||||||||||||||||||||||||||||||||||||||
常用字符集比較 | |||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||
查詢當前伺服器的字符集和校對規則: 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 時,或當與伺服器的連線被關閉時,所有由當前執行緒鎖定的表被隱含地解鎖 |
||||||||||||||||||
一個獲得表鎖和釋放表鎖的簡單例子 | ||||||||||||||||||
|
|
|||||||||||||||||
事物控制 : 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
|
|
||||||||||||||||||||||||||||||||
|
從第18章SQL 最佳化開始 往後每章節都需要仔細閱讀書籍和資料。由於知識點過多,所以在此先不做整理。
後續可能會對一些點做整理 另發部落格。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28602568/viewspace-1622174/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 《MySQL深入淺出》1-17章節閱讀整理MySql
- 閱讀推薦——深入淺出Mesos
- 深入淺出sga和pga章節記載-01
- 《深入淺出MySQL》讀書筆記MySql筆記
- 讀深入淺出MFC的一節筆記 (轉)筆記
- 淺讀-《深入淺出Nodejs》NodeJS
- Tomcat深入淺出——最終章(六)Tomcat
- 精讀《深入淺出Node.js》Node.js
- 深入淺出node讀書筆記筆記
- 重讀eygle的<<深入淺出oracle>>Oracle
- 深入淺出FE(十四)深入淺出websocketWeb
- 深入解析Oracle第四章 自用閱讀記錄Oracle
- 深入淺出Nodejs讀書筆記NodeJS筆記
- 讀《深入淺出Node.js》隨感Node.js
- 深入淺出Mysql索引的那些事兒MySql索引
- 深入淺出MYSQL的事務隔離MySql
- [TEAP早期試讀]《深入淺出CoffeeScript》集合與迭代節選和若干問題
- 閱讀《深入理解ES6》書籍,筆記整理(上)筆記
- 史上最深入淺出的IT術語解讀
- Oracle 官方教材閱讀整理Oracle
- iOS閱讀類需求 展開 收起章節 卡頓解決辦法iOS
- 《深入淺出MFC》讀書筆記(一,二) (轉)筆記
- 深入淺出——MVCMVC
- 深入淺出mongooseGo
- HTTP深入淺出HTTP
- 深入淺出IO
- 深入淺出 RabbitMQMQ
- 深入淺出PromisePromise
- ArrayList 深入淺出
- mysqldump 深入淺出MySql
- 深入淺出decorator
- 深入淺出 ZooKeeper
- 機器學習深入淺出機器學習
- 深入淺出HTTPHTTP
- http 深入淺出HTTP
- 深入淺出 ARCore
- 深入淺出 synchronizedsynchronized
- 深入淺出WebpackWeb