MySQL 進階介紹                   Stanley Huang              wenlien1001@gmail.com                      lab files:https://dl.dr...
大綱•   MySQL 架構介紹•   進階查詢範例介紹•   管理帳號與權限設定•   設定 MySQL 執行時期選項•   了解 MySQL 中之資料鎖定觀念與不同層次的鎖    定•   MySQL 工具,執行備份與回復•   store...
MySQL 架構介紹資料來源: http://dev.mysql.com/doc/refman/5.5/en/pluggable-storage-overview.html                                    ...
連接器• MySQL 提供標準的連接器驅動程式,使軟體開發  人員可以選擇任一的程式語言來開發資料庫應用  系統。• 目前提供的連接器有: –   ADO.NET 驅動程式 (Connector/NET) –   ODBC 驅動程式 (Conn...
連接器 ( 續 )• 除了官方的驅動程式外,社群也提供幾個  的驅動程式: – PHP 驅動程式 (mysqli, ext/mysqli,   PDO_MYSQLND, PHP_MYSQLND) – Perl 驅動程式 (DBD::MySQL)...
連線池• 連線池是用來開啟連線並管理連線資源的  技術。當多線程使用需要資料庫連線時,  便可以直接使用連線池中的資料庫連線。• 連線池的優點: – 減少重複連線的時間。 – 簡化程式模組。 – 限制資源的使用。                ...
SQL 介面• SQL 介面是用來接受從使用者或 MySQL  應用程式而來 SQL 指令並將指令傳送給  SQL 解析器。• 這個介面與儲存端無關,所以, SQL 指令  也與儲存引擎無關。                  7/80
解析器• 解析器可以分析 SQL 的指令及確認 SQL  指令的正確性。• 解析器拆解 SQL 指令並建立解析的樹狀結  構,藉由樹狀結構,來決定 SQL 查詢語法  的正確性並將指令傳給優化器。                  8/80
優化器• MySQL 利用優化器使 SQL 指令的執行可  達到最快的速度。• 為了讓第一次的查詢結果可以過濾越多的  資料以達到優化的目的, MySQL 的優化器  會儘量使用條件越多的索引。                   9/80
快取與緩衝區• 快取與緩衝區是用來暫存資料,其目的在  加速資料的查詢。               10/80
練習一• 試說明 MySQL 的架構。                   11/80
進階查詢範例介紹•   Join 語法•   全文檢索 ( 只適用於 MyISAM)•   行數•   常用函數介紹                          12/80
Inner/Natural Join[Join]mysql> select id.id, id.addr, account.namefrom id, accountwhere id.id = account.id;[Inner Join]mys...
Left/Right Join[Left Join]mysql> select id.id, id.addr, account.name from idleft join account on id.id = account.id;mysql>...
Cross/Self Join[Cross Join]mysql> select * from id, account;mysql> select * from id cross join account;[Self Join]mysql> s...
全文檢索mysql> select * from full_textwhere match(edition)against (+MySQL -Cluster in boolean mode);                          ...
行數mysql> use demo;Database changedmysql> set @row_count = 0;Query OK, 0 rows affected (0.00 sec)mysql> select *, @row_coun...
常用函數介紹•   流程控制函數•   字串函數•   數值函數•   日期時間函數                 18/80
流程控制函數• if• ifnull, nullif• case                            19/80
ifmysql> select s.id, if(s.id > 2, >2, <2)from (select 1 as id union select 2 as id unionselect 3 as id union select null ...
ifnull / nullifmysql> select s.id,isnull(s.id) as isnull,ifnull(s.id, "Its null") as ifnull,nullif(s.id, 1) as nullif(1)fr...
casemysql> select s.id, case s.idwhen 1 then onewhen 2 then twowhen 3 then threeend as case testingfrom (select 1 as id un...
字串函數•   length•   concat, concat_ws•   instr•   left, right•   lower, upper•   trim, ltrim, rtrim•   repeat•   replace•   ...
數值函數•   abs•   cos, sin, tan•   ceiling, floor, round•   exp•   format•   mod•   pow•   rand•   sign•   truncate          ...
日期時間函數•   interval•   curdate, curtime, now•   date_add, date_sub•   adddate, addtime•   date, time•   datediff•   date_fo...
練習二• 試從 demo.orders 資料表中,將商品分類  為 >20,<20,=20 。• 如何刪除重複的資料?• 如何利用 SQL 語法做出 Row to Column 的  表格?• 銀行三點半報表。                 ...
管理帳號與權限設定•   帳號命名規則•   帳號管理•   設定密碼•   mysql 客戶端連線設定•   帳號權限管理                    27/80
帳號命名規則• 帳號最長只能為 16 個字元• 帳號 @ 主機名稱                   28/80
建立新帳號• 使用 create 指令  mysql> create user stanley@localhost    identified by ‘stanley’;• 使用 grant 指令  mysql> grant all on *....
移除帳號• 使用 drop 指令 mysql> drop user stanley@localhost  identified by ‘stanley’;                             30/80
檢查使用者權限mysql> show grants for joseph@localhost;+---------------------------------------------------------------------+| Gr...
設定密碼• 密碼儲存在 mysql.user• 密碼是以明碼加密的方式儲存• 加密函式為 password()                     32/80
設定密碼mysql> set password for stanley@localhost = password(456);Query OK, 0 rows affected (0.00 sec)mysql> select user, host...
權限設定• Grant syntax :GRANT priv_type [(column_list)]  [, priv_type [(column_list)]] ... ON [object_type] priv_level TO user...
權限設定 ( 續 )object_type:    TABLE | FUNCTION | PROCEDUREpriv_level:    * | *.* | db_name.* |   db_name.tbl_name | tbl_name |...
權限設定 ( 續 )with_option:    GRANT OPTION  | MAX_QUERIES_PER_HOUR count  | MAX_UPDATES_PER_HOUR count  | MAX_CONNECTIONS_PER_...
移除權限• Revoke syntax :REVOKE    priv_type [(column_list)]       [, priv_type [(column_list)]] ...    ON [object_type] priv_...
帳號權限管理• 權限資料表存放在 mysql 資料庫中。• 與權限相關的資料表: – user – host ( 已廢棄不用 ) – db – tables_priv – columns_priv – procs_priv – proxies_...
user• user 資料表包含的資訊: – 使用者帳號 – 全域權限 – 其他非權限相關欄位• 範例: – mysql> use mysql; desc user; – mysql> select * from user;          ...
db• db 資料表包含的資訊: – 資料庫層級的權限資訊• 範例: – mysql> use mysql; desc db; – mysql> select * from db;                                ...
tables_priv• tables_priv 資料表包含的資訊: – 資料表層級的權限資訊• 範例: – mysql> use mysql; desc tables_priv; – mysql> select * from tables_p...
columns_priv• columns_priv 資料表包含的資訊: – 欄位層級的權限資訊• 範例: – mysql> use mysql; desc columns_priv; – mysql> select * from column...
procs_priv• procs_priv 資料表包含的資訊: – 預儲程序 (Stored Procedure) 層級的權限資訊• 範例: – mysql> use mysql; desc procs_priv; – mysql> sele...
proxies_priv• proxies_priv 資料表包含的資訊: – 代理人的權限資訊• 範例: – mysql> use mysql; desc proxies_priv; – mysql> select * from proxies...
練習三• 建立一個新的帳號。• 修改密碼。• 設定帳號權限。              45/80
設定 MySQL 執行時期選項• Using System Variables   mysql> show variables;   mysql> show global variables;   mysql> show local varia...
my.cnf/my.ini 範例 (1/4)• The following options will be passed to all MySQL clients[client]#password = your_passwordport    ...
my.cnf/my.ini 範例 (2/4)• The following options will be passed to mysqldump[mysqldump]quickmax_allowed_packet = 16M• The fol...
my.cnf/my.ini 範例 (3/4)• The following options will be passed to myisamchk[myisamchk]key_buffer_size = 128Msort_buffer_size...
my.cnf/my.ini 範例 (4/4)• The MySQL server[mysqld]port      = 3306socket    = /tmp/mysql.sockkey_buffer_size = 256Mmax_allow...
練習四• 練習設定 MySQL 設定檔,並重啟  MySQL 。• 假設你忘記 root 的密碼,要如何重設 root  的密碼?                     51/80
了解 MySQL 中之資料鎖定觀念     與不同層次的鎖定• 在 MySQL 的鎖定可以分成兩類: – 表鎖定  • MyISAM  • Memory  • Merge – 列鎖定  • InnoDB                   52...
列鎖定• 優點: – 當不同的連線在存取不同的資料列時,可以減少鎖定   的衝突。 – 減少資料回復 (Rollback) 時的變動量。 – 可以在單一資料列上做長時間的鎖定。• 缺點: – 跟表鎖定比較起來,需要較多的記憶體。 – 在鎖定資料...
Lock 與 Unlock 的語法LOCK TABLES tbl_name [[AS] alias]  lock_type [, tbl_name [[AS] alias]  lock_type] ...lock_type: READ [LOC...
Read lock with transactionFLUSH TABLES WITH READ LOCK;START TRANSACTION;SELECT ... ;UNLOCK TABLES;                        ...
Lock with Innodb• select … for update;  – 防止其它 session 讀取及修改資料• select … lock in share mode;  – 允許其它 session 讀取資料但不允許修改   ...
練習五• 練習資料表鎖定。              57/80
MySQL 工具,執行備份與回復• mysqldump  Usage: mysqldump [OPTIONS] database [tables]  OR     mysqldump [OPTIONS] --databases [OPTIONS...
MySQL 工具,執行備份與回復備份注意事項: 1. 備份前,先執行指令” FLUSH TABLES    tbl_list WITH READ LOCK;” 。 2. 儘量不要使用 mysqldump ,而是用拷貝完整    的 MySQL ...
使用 Workbench 備份與回復              60/80
練習六• 習練不同的備份資料的方式,並嘗試回復  它。               61/80
儲存程式• 儲存程式包含下列三種: – 儲存程序( Stored Routines ) – 觸發器( Triggers ) – 事件( Events )                             62/80
儲存程序• 儲存程序包含: – 儲存步驟( Stored Procedure ) – 儲存函式( Stored Function )• 儲存步驟不會回傳值而儲存函式會有回傳  值。                              63...
儲存程序語法Syntax:CREATE    [DEFINER = { user | CURRENT_USER }]    PROCEDURE sp_name ([proc_parameter[,...]])    [characteristi...
觸發器• 觸發器是關聯到資料表特定事件的物件,  而事件發生時(例如:插入資料或更新資  料),就會觸發物件反應。               65/80
觸發時機• 事件前 – before• 事件後 – after                   66/80
觸發器事件• 新增 – insert – load data – replace• 修改 – update• 刪除 – update – replace – 不包含 (drop table, truncate table)           ...
觸發器語法• Syntax:CREATE    [DEFINER = { user |  CURRENT_USER }]    TRIGGER trigger_name  trigger_time trigger_event    ON tbl...
事件• 事件是資料庫系統根據時間排程而執行的  工作。               69/80
事件語法Syntax:CREATE    EVENT event_name    ON SCHEDULE scheduleDO event_bodyschedule:    AT timestamp [+ INTERVAL interval] ...
練習七• 寫一個 hello world 的儲存函式。  mysql> select hello(‘world’);  hello world!• 寫一個儲存步驟,以 target 資料表的資料為基準  ,抄寫大量資料到 my_target 資...
透過查詢最佳化以改善效能• 建立索引• 使用“ explain” 指令                    72/80
建立索引Syntax:CREATE [ONLINE|OFFLINE] [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name    [index_type]    ON tbl_name (index_col_na...
檢視索引Syntax:show index from [table name]                           74/80
explainSyntax:EXPLAIN [EXTENDED | PARTITIONS]  SELECT select_optionsOr:EXPLAIN tbl_name                           75/80
練習八• 練習建立索引• 練習使用 explain 指令                    76/80
運用 MySQL 監控工具以改善伺服器          效能• 常用的效能監控工具: – Cacti (PHP,MySQL,SNMP 及 RRDTool ) – MysqlReport (Perl) – phpMyAdmin (PHP) – ...
慢查詢•   套用記錄慢查詢設定    – log_slow_queries    – long_query_time=10    – slow_query_log_file=…                              78/80
練習九• 利用 Workbench 來監控 MySQL 效能。                       79/80
Q&A      80/80
Upcoming SlideShare
Loading in …5
×

MySQL進階介紹

2,804 views

Published on

MySQL advanced introduction.

Published in: Technology
0 Comments
11 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,804
On SlideShare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
48
Comments
0
Likes
11
Embeds 0
No embeds

No notes for slide
  • Ref: ref_flow_control.sql
  • Ref: ref_string.sql
  • Ref: ref_numeric.sql
  • Ref: ref_date.sql
  • Ref: ex_2-1_compare_to_20.sql ex_2-2_insert_duplicated_data.sql ex_2-2_delete_duplicated_data.sql ex_2-3_insert_row2column_data.sql ex_2-3_select_row2column_data.sql ex_2-4_insert_bank_account_data.sql ex_2-4_select_bank_account_data.sql ex_2-3_select_row2column_data.sql
  • Ref: ex_3-1_create user.sql ex_3-2_change password.sql ex_3-3_grant privileges.sql
  • Ref: ex_4-1_init.txt ex_4-2_resetRootPassword.sh
  • Ref: ref_lock.sql
  • Ref: ref_7-1_function.sql ref_7-2_insert_data.sql ref_7-2_procedure.sql
  • Ref: ref_7-3_trigger.sql
  • Ref: ex_7-1_function.sql ex_7-2_procedure.sql ex_7-3_trigger.sql ex_7-4_event.sql
  • Ref: ref_8-1_create_index.sql
  • Ref: ref_8-2_explain.sql
  • MySQL進階介紹

    1. 1. MySQL 進階介紹 Stanley Huang wenlien1001@gmail.com lab files:https://dl.dropbox.com/u/17022391/MySQL/MySQL_advanced_labfiles.tar.gz 1/80
    2. 2. 大綱• MySQL 架構介紹• 進階查詢範例介紹• 管理帳號與權限設定• 設定 MySQL 執行時期選項• 了解 MySQL 中之資料鎖定觀念與不同層次的鎖 定• MySQL 工具,執行備份與回復• stored routines 及 triggers 運用於管理工作• 透過查詢最佳化以改善效能• 運用 MySQL 監控工具以改善伺服器效能 2/80
    3. 3. MySQL 架構介紹資料來源: http://dev.mysql.com/doc/refman/5.5/en/pluggable-storage-overview.html 3/80
    4. 4. 連接器• MySQL 提供標準的連接器驅動程式,使軟體開發 人員可以選擇任一的程式語言來開發資料庫應用 系統。• 目前提供的連接器有: – ADO.NET 驅動程式 (Connector/NET) – ODBC 驅動程式 (Connector/ODBC) – JDBC 驅動程式 (Connector/J) – C++ 驅動程式 (Connector/C++) – C 驅動程式 (Connector/C) – C API(mysqlclient) 4/80
    5. 5. 連接器 ( 續 )• 除了官方的驅動程式外,社群也提供幾個 的驅動程式: – PHP 驅動程式 (mysqli, ext/mysqli, PDO_MYSQLND, PHP_MYSQLND) – Perl 驅動程式 (DBD::MySQL) – Python 驅動程式 (MySQLdb) – Ruby 驅動程式 (DBD::MySQL) – Ruby 驅動程式 (ruby-mysql) – C++ Wrapper for MySQL C API(MySQL++) 5/80
    6. 6. 連線池• 連線池是用來開啟連線並管理連線資源的 技術。當多線程使用需要資料庫連線時, 便可以直接使用連線池中的資料庫連線。• 連線池的優點: – 減少重複連線的時間。 – 簡化程式模組。 – 限制資源的使用。 6/80
    7. 7. SQL 介面• SQL 介面是用來接受從使用者或 MySQL 應用程式而來 SQL 指令並將指令傳送給 SQL 解析器。• 這個介面與儲存端無關,所以, SQL 指令 也與儲存引擎無關。 7/80
    8. 8. 解析器• 解析器可以分析 SQL 的指令及確認 SQL 指令的正確性。• 解析器拆解 SQL 指令並建立解析的樹狀結 構,藉由樹狀結構,來決定 SQL 查詢語法 的正確性並將指令傳給優化器。 8/80
    9. 9. 優化器• MySQL 利用優化器使 SQL 指令的執行可 達到最快的速度。• 為了讓第一次的查詢結果可以過濾越多的 資料以達到優化的目的, MySQL 的優化器 會儘量使用條件越多的索引。 9/80
    10. 10. 快取與緩衝區• 快取與緩衝區是用來暫存資料,其目的在 加速資料的查詢。 10/80
    11. 11. 練習一• 試說明 MySQL 的架構。 11/80
    12. 12. 進階查詢範例介紹• Join 語法• 全文檢索 ( 只適用於 MyISAM)• 行數• 常用函數介紹 12/80
    13. 13. Inner/Natural Join[Join]mysql> select id.id, id.addr, account.namefrom id, accountwhere id.id = account.id;[Inner Join]mysql> select id.id, id.addr, account.namefrom id inner join account on id.id = account.id;[Natural Join]mysql> select * from id natural join account; 13/80
    14. 14. Left/Right Join[Left Join]mysql> select id.id, id.addr, account.name from idleft join account on id.id = account.id;mysql> select * from idleft join account using (id);[Left Join]mysql> select account.id, account.name, id.addr from idright join account on id.id = account.id;mysql> select * from idright join account using (id); 14/80
    15. 15. Cross/Self Join[Cross Join]mysql> select * from id, account;mysql> select * from id cross join account;[Self Join]mysql> select id.* from id, id as selfwhere id.id = self.id; 15/80
    16. 16. 全文檢索mysql> select * from full_textwhere match(edition)against (+MySQL -Cluster in boolean mode); 16/80
    17. 17. 行數mysql> use demo;Database changedmysql> set @row_count = 0;Query OK, 0 rows affected (0.00 sec)mysql> select *, @row_count := @row_count + 1 as row_count from id;+------+-----------+-----------+| id | addr | row_count |+------+-----------+-----------+| 1 | taipei | 4 || 2 | taichung | 5 || 3 | kaoshiung | 6 |+------+-----------+-----------+3 rows in set (0.00 sec) 17/80
    18. 18. 常用函數介紹• 流程控制函數• 字串函數• 數值函數• 日期時間函數 18/80
    19. 19. 流程控制函數• if• ifnull, nullif• case 19/80
    20. 20. ifmysql> select s.id, if(s.id > 2, >2, <2)from (select 1 as id union select 2 as id unionselect 3 as id union select null as id) as s;+------+--------------------------+| id | if(s.id > 2, >2, <2) |+------+--------------------------+| 1 | <2 || 2 | <2 || 3 | >2 || NULL | <2 |+------+--------------------------+4 rows in set (0.00 sec)from 20/80
    21. 21. ifnull / nullifmysql> select s.id,isnull(s.id) as isnull,ifnull(s.id, "Its null") as ifnull,nullif(s.id, 1) as nullif(1)from (select 1 as id union select 2 as id unionselect 3 as id union select null as id) as s;+------+--------+-----------+-----------+| id | isnull | ifnull | nullif(1) |+------+--------+-----------+-----------+| 1 | 0 | 1 | NULL || 2 | 0 | 2 | 2 || 3 | 0 | 3 | 3 || NULL | 1 | Its null | NULL |+------+--------+-----------+-----------+4 rows in set (0.00 sec) 21/80
    22. 22. casemysql> select s.id, case s.idwhen 1 then onewhen 2 then twowhen 3 then threeend as case testingfrom (select 1 as id union select 2 as id unionselect 3 as id union select null as id) as s;+------+--------------+| id | case testing |+------+--------------+| 1 | one || 2 | two || 3 | three || NULL | NULL |+------+--------------+4 rows in set (0.00 sec) 22/80
    23. 23. 字串函數• length• concat, concat_ws• instr• left, right• lower, upper• trim, ltrim, rtrim• repeat• replace• reverse• space• substring, substring_index• regexp• strcmp 23/80
    24. 24. 數值函數• abs• cos, sin, tan• ceiling, floor, round• exp• format• mod• pow• rand• sign• truncate 24/80
    25. 25. 日期時間函數• interval• curdate, curtime, now• date_add, date_sub• adddate, addtime• date, time• datediff• date_format• unix_timestamp, from_unixtime• str_to_date• year, month, day, hour, minute, second, week• utc_date, utc_time, utc_timestamp 25/80
    26. 26. 練習二• 試從 demo.orders 資料表中,將商品分類 為 >20,<20,=20 。• 如何刪除重複的資料?• 如何利用 SQL 語法做出 Row to Column 的 表格?• 銀行三點半報表。 26/80
    27. 27. 管理帳號與權限設定• 帳號命名規則• 帳號管理• 設定密碼• mysql 客戶端連線設定• 帳號權限管理 27/80
    28. 28. 帳號命名規則• 帳號最長只能為 16 個字元• 帳號 @ 主機名稱 28/80
    29. 29. 建立新帳號• 使用 create 指令 mysql> create user stanley@localhost identified by ‘stanley’;• 使用 grant 指令 mysql> grant all on *.* to joseph@localhost; ERROR 1133 (42000): Cant find any matching row in the user table mysql> grant all on *.* to joseph@localhost‘ identified by 123; Query OK, 0 rows affected (0.00 sec) 29/80
    30. 30. 移除帳號• 使用 drop 指令 mysql> drop user stanley@localhost identified by ‘stanley’; 30/80
    31. 31. 檢查使用者權限mysql> show grants for joseph@localhost;+---------------------------------------------------------------------+| Grants for joseph@localhost |+---------------------------------------------------------------------+| GRANT ALL PRIVILEGES ON *.* TO ‘joseph@localhost‘ IDENTIFIED BY || PASSWORD * 23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |+---------------------------------------------------------------------+ 31/80
    32. 32. 設定密碼• 密碼儲存在 mysql.user• 密碼是以明碼加密的方式儲存• 加密函式為 password() 32/80
    33. 33. 設定密碼mysql> set password for stanley@localhost = password(456);Query OK, 0 rows affected (0.00 sec)mysql> select user, host, password from mysql.user where user=stanley;+---------+-----------+-------------------------------------------+| user | host | password |+---------+-----------+-------------------------------------------+| stanley | localhost | *531E182E2F72080AB0740FE2F2D689DBE0146E04 |+---------+-----------+-------------------------------------------+1 row in set (0.00 sec)mysql> 33/80
    34. 34. 權限設定• Grant syntax :GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] priv_level TO user_specification [, user_specification] ... [REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}] [WITH with_option ...] 34/80
    35. 35. 權限設定 ( 續 )object_type: TABLE | FUNCTION | PROCEDUREpriv_level: * | *.* | db_name.* | db_name.tbl_name | tbl_name | db_name.routine_nameuser_specification: user [ IDENTIFIED BY [PASSWORD] password‘ ] 35/80
    36. 36. 權限設定 ( 續 )with_option: GRANT OPTION | MAX_QUERIES_PER_HOUR count | MAX_UPDATES_PER_HOUR count | MAX_CONNECTIONS_PER_HOUR count | MAX_USER_CONNECTIONS count 36/80
    37. 37. 移除權限• Revoke syntax :REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] priv_level FROM user [, user] ...REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ... 37/80
    38. 38. 帳號權限管理• 權限資料表存放在 mysql 資料庫中。• 與權限相關的資料表: – user – host ( 已廢棄不用 ) – db – tables_priv – columns_priv – procs_priv – proxies_priv 38/80
    39. 39. user• user 資料表包含的資訊: – 使用者帳號 – 全域權限 – 其他非權限相關欄位• 範例: – mysql> use mysql; desc user; – mysql> select * from user; 39/80
    40. 40. db• db 資料表包含的資訊: – 資料庫層級的權限資訊• 範例: – mysql> use mysql; desc db; – mysql> select * from db; 40/80
    41. 41. tables_priv• tables_priv 資料表包含的資訊: – 資料表層級的權限資訊• 範例: – mysql> use mysql; desc tables_priv; – mysql> select * from tables_priv; 41/80
    42. 42. columns_priv• columns_priv 資料表包含的資訊: – 欄位層級的權限資訊• 範例: – mysql> use mysql; desc columns_priv; – mysql> select * from columns_priv; 42/80
    43. 43. procs_priv• procs_priv 資料表包含的資訊: – 預儲程序 (Stored Procedure) 層級的權限資訊• 範例: – mysql> use mysql; desc procs_priv; – mysql> select * from procs_priv; 43/80
    44. 44. proxies_priv• proxies_priv 資料表包含的資訊: – 代理人的權限資訊• 範例: – mysql> use mysql; desc proxies_priv; – mysql> select * from proxies_priv; 44/80
    45. 45. 練習三• 建立一個新的帳號。• 修改密碼。• 設定帳號權限。 45/80
    46. 46. 設定 MySQL 執行時期選項• Using System Variables mysql> show variables; mysql> show global variables; mysql> show local variables; mysql> select @@global.sort_buffer_size; mysql> select @@local.sort_buffer_size; mysql> select @@session.sort_buffer_size; mysql> select @@sort_buffer_size; mysql> set global sort_buffer_size=100001, session sort_buffer_size=10002; mysql> set @@sort_buffer_size=10003; mysql> set @@global.sort_buffer_size=100004, @@local.sort_buffer_size=10005;• my.cnf/my.ini 46/80
    47. 47. my.cnf/my.ini 範例 (1/4)• The following options will be passed to all MySQL clients[client]#password = your_passwordport = 3306socket = /tmp/mysql.sock 47/80
    48. 48. my.cnf/my.ini 範例 (2/4)• The following options will be passed to mysqldump[mysqldump]quickmax_allowed_packet = 16M• The following options will be passed to mysql[mysql]no-auto-rehash# Remove the next comment character if you are not familiar with SQL#safe-updates 48/80
    49. 49. my.cnf/my.ini 範例 (3/4)• The following options will be passed to myisamchk[myisamchk]key_buffer_size = 128Msort_buffer_size = 128Mread_buffer = 2Mwrite_buffer = 2M 49/80
    50. 50. my.cnf/my.ini 範例 (4/4)• The MySQL server[mysqld]port = 3306socket = /tmp/mysql.sockkey_buffer_size = 256Mmax_allowed_packet = 1Mtable_open_cache = 256sort_buffer_size = 1Mread_buffer_size = 1M 50/80
    51. 51. 練習四• 練習設定 MySQL 設定檔,並重啟 MySQL 。• 假設你忘記 root 的密碼,要如何重設 root 的密碼? 51/80
    52. 52. 了解 MySQL 中之資料鎖定觀念 與不同層次的鎖定• 在 MySQL 的鎖定可以分成兩類: – 表鎖定 • MyISAM • Memory • Merge – 列鎖定 • InnoDB 52/80
    53. 53. 列鎖定• 優點: – 當不同的連線在存取不同的資料列時,可以減少鎖定 的衝突。 – 減少資料回復 (Rollback) 時的變動量。 – 可以在單一資料列上做長時間的鎖定。• 缺點: – 跟表鎖定比較起來,需要較多的記憶體。 – 在鎖定資料表中的大量資料時,其效能比表鎖定來的 慢。因為你需要取得更多的資料鎖。 – 如果你經常在大量的資料中,使用 GROUP BY ,或者 是你經常需要掃過整個資料表。此時,列鎖定會比其 它鎖的效能更慢。 53/80
    54. 54. Lock 與 Unlock 的語法LOCK TABLES tbl_name [[AS] alias] lock_type [, tbl_name [[AS] alias] lock_type] ...lock_type: READ [LOCAL] | [LOW_PRIORITY] WRITEUNLOCK TABLES 54/80
    55. 55. Read lock with transactionFLUSH TABLES WITH READ LOCK;START TRANSACTION;SELECT ... ;UNLOCK TABLES; 55/80
    56. 56. Lock with Innodb• select … for update; – 防止其它 session 讀取及修改資料• select … lock in share mode; – 允許其它 session 讀取資料但不允許修改 56/80
    57. 57. 練習五• 練習資料表鎖定。 57/80
    58. 58. MySQL 工具,執行備份與回復• mysqldump Usage: mysqldump [OPTIONS] database [tables] OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] OR mysqldump [OPTIONS] --all-databases [OPTIONS] For more options, use mysqldump –help Ex. mysqldump -u root -p --databases mysql > mysql.sql• mysqlimport/mysql Usage: mysqlimport [OPTIONS] database textfile... Default options are read from the following files in the given order: C:Windowsmy.ini C:Windowsmy.cnf C:my.ini C:my.cnf C:Program FilesMySQLMySQL Server 5.5my.ini C:Program FilesMySQLMySQL Server 5.5my.cnf Ex1. mysqlimport -u root -p mysql mysql.sql Ex2. mysql -u -p mysql < mysql.sql 58/80
    59. 59. MySQL 工具,執行備份與回復備份注意事項: 1. 備份前,先執行指令” FLUSH TABLES tbl_list WITH READ LOCK;” 。 2. 儘量不要使用 mysqldump ,而是用拷貝完整 的 MySQL 資料目錄。 59/80
    60. 60. 使用 Workbench 備份與回復 60/80
    61. 61. 練習六• 習練不同的備份資料的方式,並嘗試回復 它。 61/80
    62. 62. 儲存程式• 儲存程式包含下列三種: – 儲存程序( Stored Routines ) – 觸發器( Triggers ) – 事件( Events ) 62/80
    63. 63. 儲存程序• 儲存程序包含: – 儲存步驟( Stored Procedure ) – 儲存函式( Stored Function )• 儲存步驟不會回傳值而儲存函式會有回傳 值。 63/80
    64. 64. 儲存程序語法Syntax:CREATE [DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_bodyCREATE [DEFINER = { user | CURRENT_USER }] FUNCTION sp_name ([func_parameter[,...]]) RETURNS type [characteristic ...] routine_bodyproc_parameter: [ IN | OUT | INOUT ] param_name typefunc_parameter: param_name typecharacteristic: COMMENT string | LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } 64/80
    65. 65. 觸發器• 觸發器是關聯到資料表特定事件的物件, 而事件發生時(例如:插入資料或更新資 料),就會觸發物件反應。 65/80
    66. 66. 觸發時機• 事件前 – before• 事件後 – after 66/80
    67. 67. 觸發器事件• 新增 – insert – load data – replace• 修改 – update• 刪除 – update – replace – 不包含 (drop table, truncate table) 67/80
    68. 68. 觸發器語法• Syntax:CREATE [DEFINER = { user | CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_body 68/80
    69. 69. 事件• 事件是資料庫系統根據時間排程而執行的 工作。 69/80
    70. 70. 事件語法Syntax:CREATE EVENT event_name ON SCHEDULE scheduleDO event_bodyschedule: AT timestamp [+ INTERVAL interval] ... | EVERY interval [STARTS timestamp [+ INTERVAL interval] ...] [ENDS timestamp [+ INTERVAL interval] ...] 70/80
    71. 71. 練習七• 寫一個 hello world 的儲存函式。 mysql> select hello(‘world’); hello world!• 寫一個儲存步驟,以 target 資料表的資料為基準 ,抄寫大量資料到 my_target 資料表上。• 寫一個觸發器在 after update city 之後 , 將 city_summary 的 summary 欄位值歸零。• 寫一個事件 , 每 10 秒鐘修改 my_event 資料表的 now 欄位 。 71/80
    72. 72. 透過查詢最佳化以改善效能• 建立索引• 使用“ explain” 指令 72/80
    73. 73. 建立索引Syntax:CREATE [ONLINE|OFFLINE] [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [index_type] ON tbl_name (index_col_name,...) [index_option] ...index_col_name: col_name [(length)] [ASC | DESC]index_type: USING {BTREE | HASH}index_option: KEY_BLOCK_SIZE [=] value | index_type | WITH PARSER parser_name | COMMENT string 73/80
    74. 74. 檢視索引Syntax:show index from [table name] 74/80
    75. 75. explainSyntax:EXPLAIN [EXTENDED | PARTITIONS] SELECT select_optionsOr:EXPLAIN tbl_name 75/80
    76. 76. 練習八• 練習建立索引• 練習使用 explain 指令 76/80
    77. 77. 運用 MySQL 監控工具以改善伺服器 效能• 常用的效能監控工具: – Cacti (PHP,MySQL,SNMP 及 RRDTool ) – MysqlReport (Perl) – phpMyAdmin (PHP) – MySQL Administrator (Workbench) 77/80
    78. 78. 慢查詢• 套用記錄慢查詢設定 – log_slow_queries – long_query_time=10 – slow_query_log_file=… 78/80
    79. 79. 練習九• 利用 Workbench 來監控 MySQL 效能。 79/80
    80. 80. Q&A 80/80

    ×