SlideShare a Scribd company logo
MySQL 進階介紹

                   Stanley Huang
              wenlien1001@gmail.com
                      lab files:
https://dl.dropbox.com/u/17022391/MySQL/MySQL_advanced_labfiles.tar.gz

                                                     1/80
大綱
•   MySQL 架構介紹
•   進階查詢範例介紹
•   管理帳號與權限設定
•   設定 MySQL 執行時期選項
•   了解 MySQL 中之資料鎖定觀念與不同層次的鎖
    定
•   MySQL 工具,執行備份與回復
•   stored routines 及 triggers 運用於管理工作
•   透過查詢最佳化以改善效能
•   運用 MySQL 監控工具以改善伺服器效能
                              2/80
MySQL 架構介紹




資料來源: http://dev.mysql.com/doc/refman/5.5/en/pluggable-storage-overview.html
                                                        3/80
連接器
• MySQL 提供標準的連接器驅動程式,使軟體開發
  人員可以選擇任一的程式語言來開發資料庫應用
  系統。
• 目前提供的連接器有:
 –   ADO.NET 驅動程式 (Connector/NET)
 –   ODBC 驅動程式 (Connector/ODBC)
 –   JDBC 驅動程式 (Connector/J)
 –   C++ 驅動程式 (Connector/C++)
 –   C 驅動程式 (Connector/C)
 –   C API(mysqlclient)
                                    4/80
連接器 ( 續 )
• 除了官方的驅動程式外,社群也提供幾個
  的驅動程式:
 – 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/80
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.name
from id, account
where id.id = account.id;

[Inner Join]
mysql> select id.id, id.addr, account.name
from id inner join account on id.id = account.id;

[Natural Join]
mysql> select * from id natural join account;




                                             13/80
Left/Right Join
[Left Join]
mysql> select id.id, id.addr, account.name from id
left join account on id.id = account.id;
mysql> select * from id
left join account using (id);

[Left Join]
mysql> select account.id, account.name, id.addr from id
right join account on id.id = account.id;
mysql> select * from id
right join account using (id);




                                           14/80
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 self
where id.id = self.id;




                                              15/80
全文檢索
mysql> select * from full_text
where match(edition)
against ('+MySQL -Cluster' in boolean mode);




                                           16/80
行數
mysql> use demo;
Database changed
mysql> 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/80
流程控制函數
• if
• ifnull, nullif
• case




                            19/80
if
mysql> select s.id, if(s.id > 2, '>2', '<2')
from (select 1 as 'id' union select 2 as 'id' union
select 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
ifnull / nullif
mysql> select s.id,
isnull(s.id) as 'isnull',
ifnull(s.id, "It's null") as 'ifnull',
nullif(s.id, 1) as 'nullif(1)'
from (select 1 as 'id' union select 2 as 'id' union
select 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 | It's null |      NULL |
+------+--------+-----------+-----------+
4 rows in set (0.00 sec)

                                                21/80
case
mysql> select s.id, case s.id
when 1 then 'one'
when 2 then 'two'
when 3 then 'three'
end as 'case testing'
from (select 1 as 'id' union select 2 as 'id' union
select 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
字串函數
•   length
•   concat, concat_ws
•   instr
•   left, right
•   lower, upper
•   trim, ltrim, rtrim
•   repeat
•   replace
•   reverse
•   space
•   substring, substring_index
•   regexp
•   strcmp


                                 23/80
數值函數
•   abs
•   cos, sin, tan
•   ceiling, floor, round
•   exp
•   format
•   mod
•   pow
•   rand
•   sign
•   truncate




                             24/80
日期時間函數
•   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
練習二
• 試從 demo.orders 資料表中,將商品分類
  為 >20,<20,=20 。
• 如何刪除重複的資料?
• 如何利用 SQL 語法做出 Row to Column 的
  表格?
• 銀行三點半報表。



                       26/80
管理帳號與權限設定
•   帳號命名規則
•   帳號管理
•   設定密碼
•   mysql 客戶端連線設定
•   帳號權限管理




                    27/80
帳號命名規則
• 帳號最長只能為 16 個字元
• 帳號 @ 主機名稱




                   28/80
建立新帳號
• 使用 create 指令
  mysql> create user stanley@localhost
    identified by ‘stanley’;
• 使用 grant 指令
  mysql> grant all on *.* to
    'joseph'@'localhost';
  ERROR 1133 (42000): Can't 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
移除帳號
• 使用 drop 指令
 mysql> drop user stanley@localhost
  identified by ‘stanley’;




                             30/80
檢查使用者權限
mysql> show grants for joseph@localhost;
+---------------------------------------------------------------------+
| Grants for joseph@localhost                                         |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO ‘joseph'@'localhost‘ IDENTIFIED BY   |
| PASSWORD '* 23AE809DDACAF96AF0FD78ED04B6A265E05AA257'               |
+---------------------------------------------------------------------+




                                                      31/80
設定密碼
• 密碼儲存在 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, password from mysql.user where user='stanley';
+---------+-----------+-------------------------------------------+
| user    | host      | password                                  |
+---------+-----------+-------------------------------------------+
| stanley | localhost | *531E182E2F72080AB0740FE2F2D689DBE0146E04 |
+---------+-----------+-------------------------------------------+
1 row in set (0.00 sec)

mysql>




                                                      33/80
權限設定
• 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
權限設定 ( 續 )
object_type:
    TABLE | FUNCTION | PROCEDURE

priv_level:
    * | *.* | db_name.* |
   db_name.tbl_name | tbl_name |
   db_name.routine_name

user_specification:
     user
     [
          IDENTIFIED BY [PASSWORD] 'password‘
   ]


                                                35/80
權限設定 ( 續 )
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
移除權限
• 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
帳號權限管理
• 權限資料表存放在 mysql 資料庫中。
• 與權限相關的資料表:
 – user
 – host ( 已廢棄不用 )
 – db
 – tables_priv
 – columns_priv
 – procs_priv
 – proxies_priv


                    38/80
user
• user 資料表包含的資訊:
 – 使用者帳號
 – 全域權限
 – 其他非權限相關欄位
• 範例:
 – mysql> use mysql; desc user;
 – mysql> select * from user;


                              39/80
db
• db 資料表包含的資訊:
 – 資料庫層級的權限資訊
• 範例:
 – mysql> use mysql; desc db;
 – mysql> select * from db;




                                40/80
tables_priv
• tables_priv 資料表包含的資訊:
 – 資料表層級的權限資訊
• 範例:
 – mysql> use mysql; desc tables_priv;
 – mysql> select * from tables_priv;




                              41/80
columns_priv
• columns_priv 資料表包含的資訊:
 – 欄位層級的權限資訊
• 範例:
 – mysql> use mysql; desc columns_priv;
 – mysql> select * from columns_priv;




                              42/80
procs_priv
• procs_priv 資料表包含的資訊:
 – 預儲程序 (Stored Procedure) 層級的權限資訊
• 範例:
 – mysql> use mysql; desc procs_priv;
 – mysql> select * from procs_priv;




                              43/80
proxies_priv
• proxies_priv 資料表包含的資訊:
 – 代理人的權限資訊
• 範例:
 – mysql> use mysql; desc proxies_priv;
 – mysql> select * from proxies_priv;




                              44/80
練習三
• 建立一個新的帳號。
• 修改密碼。
• 設定帳號權限。




              45/80
設定 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
my.cnf/my.ini 範例 (1/4)
• The following options will be passed to all MySQL clients
[client]
#password = your_password
port      = 3306
socket    = /tmp/mysql.sock




                                             47/80
my.cnf/my.ini 範例 (2/4)
• The following options will be passed to mysqldump
[mysqldump]
quick
max_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
my.cnf/my.ini 範例 (3/4)
• The following options will be passed to myisamchk
[myisamchk]
key_buffer_size = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M




                                           49/80
my.cnf/my.ini 範例 (4/4)
• The MySQL server
[mysqld]
port      = 3306
socket    = /tmp/mysql.sock
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M



                              50/80
練習四
• 練習設定 MySQL 設定檔,並重啟
  MySQL 。
• 假設你忘記 root 的密碼,要如何重設 root
  的密碼?




                     51/80
了解 MySQL 中之資料鎖定觀念
     與不同層次的鎖定
• 在 MySQL 的鎖定可以分成兩類:
 – 表鎖定
  • MyISAM
  • Memory
  • Merge
 – 列鎖定
  • InnoDB




                   52/80
列鎖定
• 優點:
 – 當不同的連線在存取不同的資料列時,可以減少鎖定
   的衝突。
 – 減少資料回復 (Rollback) 時的變動量。
 – 可以在單一資料列上做長時間的鎖定。
• 缺點:
 – 跟表鎖定比較起來,需要較多的記憶體。
 – 在鎖定資料表中的大量資料時,其效能比表鎖定來的
   慢。因為你需要取得更多的資料鎖。
 – 如果你經常在大量的資料中,使用 GROUP BY ,或者
   是你經常需要掃過整個資料表。此時,列鎖定會比其
   它鎖的效能更慢。

                       53/80
Lock 與 Unlock 的語法
LOCK TABLES tbl_name [[AS] alias]
  lock_type [, tbl_name [[AS] alias]
  lock_type] ...

lock_type: READ [LOCAL] |
  [LOW_PRIORITY] WRITE

UNLOCK TABLES
                            54/80
Read lock with transaction
FLUSH TABLES WITH READ LOCK;
START TRANSACTION;
SELECT ... ;
UNLOCK TABLES;




                         55/80
Lock with Innodb
• select … for update;
  – 防止其它 session 讀取及修改資料
• select … lock in share mode;
  – 允許其它 session 讀取資料但不允許修改




                                 56/80
練習五
• 練習資料表鎖定。




              57/80
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
MySQL 工具,執行備份與回復
備份注意事項:
 1. 備份前,先執行指令” FLUSH TABLES
    tbl_list WITH READ LOCK;” 。
 2. 儘量不要使用 mysqldump ,而是用拷貝完整
    的 MySQL 資料目錄。




                       59/80
使用 Workbench 備份與回復




              60/80
練習六
• 習練不同的備份資料的方式,並嘗試回復
  它。




               61/80
儲存程式
• 儲存程式包含下列三種:
 – 儲存程序( Stored Routines )
 – 觸發器( Triggers )
 – 事件( Events )




                             62/80
儲存程序
• 儲存程序包含:
 – 儲存步驟( Stored Procedure )
 – 儲存函式( Stored Function )
• 儲存步驟不會回傳值而儲存函式會有回傳
  值。




                              63/80
儲存程序語法
Syntax:
CREATE
    [DEFINER = { user | CURRENT_USER }]
    PROCEDURE sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body

CREATE
    [DEFINER = { user | CURRENT_USER }]
    FUNCTION sp_name ([func_parameter[,...]])
    RETURNS type
    [characteristic ...] routine_body

proc_parameter:
    [ IN | OUT | INOUT ] param_name type

func_parameter:
    param_name type

characteristic:
    COMMENT 'string'
  | LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }


                                                                     64/80
觸發器
• 觸發器是關聯到資料表特定事件的物件,
  而事件發生時(例如:插入資料或更新資
  料),就會觸發物件反應。




               65/80
觸發時機
• 事件前
 – before
• 事件後
 – after




                   66/80
觸發器事件
• 新增
 – insert
 – load data
 – replace
• 修改
 – update
• 刪除
 – update
 – replace
 – 不包含 (drop table, truncate table)

                                      67/80
觸發器語法
• Syntax:
CREATE
    [DEFINER = { user |
  CURRENT_USER }]
    TRIGGER trigger_name
  trigger_time trigger_event
    ON tbl_name FOR EACH ROW
  trigger_body
                           68/80
事件
• 事件是資料庫系統根據時間排程而執行的
  工作。




               69/80
事件語法
Syntax:
CREATE
    EVENT event_name
    ON SCHEDULE schedule
DO event_body

schedule:
    AT timestamp [+ INTERVAL interval] ...
  | EVERY interval
    [STARTS timestamp [+ INTERVAL interval] ...]
    [ENDS timestamp [+ INTERVAL interval] ...]


                                    70/80
練習七
• 寫一個 hello world 的儲存函式。
  mysql> select hello(‘world’);
  hello world!
• 寫一個儲存步驟,以 target 資料表的資料為基準
  ,抄寫大量資料到 my_target 資料表上。
• 寫一個觸發器在 after update city 之後 , 將
  city_summary 的 summary 欄位值歸零。
• 寫一個事件 , 每 10 秒鐘修改 my_event 資料表的
  now 欄位 。

                                  71/80
透過查詢最佳化以改善效能
• 建立索引
• 使用“ explain” 指令




                    72/80
建立索引
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
檢視索引
Syntax:
show index from [table name]




                           74/80
explain
Syntax:
EXPLAIN [EXTENDED | PARTITIONS]
  SELECT select_options
Or:
EXPLAIN tbl_name




                           75/80
練習八
• 練習建立索引
• 練習使用 explain 指令




                    76/80
運用 MySQL 監控工具以改善伺服器
          效能
• 常用的效能監控工具:
 – Cacti (PHP,MySQL,SNMP 及 RRDTool )
 – MysqlReport (Perl)
 – phpMyAdmin (PHP)
 – MySQL Administrator (Workbench)




                              77/80
慢查詢
•   套用記錄慢查詢設定
    – log_slow_queries
    – long_query_time=10
    – slow_query_log_file=…




                              78/80
練習九
• 利用 Workbench 來監控 MySQL 效能。




                       79/80
Q&A




      80/80

More Related Content

PPT
NCV 4 Mathematical Literacy Hands-On Support Slide Show - Module 1 Part 2
PPT
Mysql簡易教學
PPT
MySQL入門介紹
PPT
PHP & MySQL 教學
PPTX
My sql explain & select
PDF
My sql数据库开发的三十六条军规
PDF
MySQL数据库开发的三十六条军规
PDF
Mysql数据库开发的三十六条军规 石展_完整
NCV 4 Mathematical Literacy Hands-On Support Slide Show - Module 1 Part 2
Mysql簡易教學
MySQL入門介紹
PHP & MySQL 教學
My sql explain & select
My sql数据库开发的三十六条军规
MySQL数据库开发的三十六条军规
Mysql数据库开发的三十六条军规 石展_完整

Similar to MySQL進階介紹 (20)

PDF
Mysql开发与优化
PDF
第十一章解答
PDF
MySQL数据库设计、优化
PDF
sql-intro
PPT
mysql总结
PPTX
1到100000000 - 分布式大型网站的架构设计
PDF
OpenWebSchool - 06 - PHP + MySQL
PDF
改善Programmer生活的sql技能
PPT
第一讲 My sql初步
PDF
Introduction to MySQL and phpMyAdmin
PDF
資料庫入門 Part2
PDF
MySQL資料表正規化草稿
KEY
111030 gztechparty-小路-云时代的mysql
PDF
深入浅出My sql数据库开发、优化与管理维护 (1)
PDF
深入浅出My sql数据库开发、优化与管理维护
PPT
Mysql 培训-优化篇
PDF
第十章解答
PDF
4 葉金榮-my sql優化 - 20151219
PPTX
SQL Server 2008 新增的 T-SQL 與資料型態
PPTX
资源竞争与并发控制
Mysql开发与优化
第十一章解答
MySQL数据库设计、优化
sql-intro
mysql总结
1到100000000 - 分布式大型网站的架构设计
OpenWebSchool - 06 - PHP + MySQL
改善Programmer生活的sql技能
第一讲 My sql初步
Introduction to MySQL and phpMyAdmin
資料庫入門 Part2
MySQL資料表正規化草稿
111030 gztechparty-小路-云时代的mysql
深入浅出My sql数据库开发、优化与管理维护 (1)
深入浅出My sql数据库开发、优化与管理维护
Mysql 培训-优化篇
第十章解答
4 葉金榮-my sql優化 - 20151219
SQL Server 2008 新增的 T-SQL 與資料型態
资源竞争与并发控制
Ad

MySQL進階介紹

  • 1. MySQL 進階介紹 Stanley Huang wenlien1001@gmail.com lab files: https://dl.dropbox.com/u/17022391/MySQL/MySQL_advanced_labfiles.tar.gz 1/80
  • 2. 大綱 • MySQL 架構介紹 • 進階查詢範例介紹 • 管理帳號與權限設定 • 設定 MySQL 執行時期選項 • 了解 MySQL 中之資料鎖定觀念與不同層次的鎖 定 • MySQL 工具,執行備份與回復 • stored routines 及 triggers 運用於管理工作 • 透過查詢最佳化以改善效能 • 運用 MySQL 監控工具以改善伺服器效能 2/80
  • 4. 連接器 • MySQL 提供標準的連接器驅動程式,使軟體開發 人員可以選擇任一的程式語言來開發資料庫應用 系統。 • 目前提供的連接器有: – ADO.NET 驅動程式 (Connector/NET) – ODBC 驅動程式 (Connector/ODBC) – JDBC 驅動程式 (Connector/J) – C++ 驅動程式 (Connector/C++) – C 驅動程式 (Connector/C) – C API(mysqlclient) 4/80
  • 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/80
  • 7. SQL 介面 • SQL 介面是用來接受從使用者或 MySQL 應用程式而來 SQL 指令並將指令傳送給 SQL 解析器。 • 這個介面與儲存端無關,所以, SQL 指令 也與儲存引擎無關。 7/80
  • 8. 解析器 • 解析器可以分析 SQL 的指令及確認 SQL 指令的正確性。 • 解析器拆解 SQL 指令並建立解析的樹狀結 構,藉由樹狀結構,來決定 SQL 查詢語法 的正確性並將指令傳給優化器。 8/80
  • 9. 優化器 • MySQL 利用優化器使 SQL 指令的執行可 達到最快的速度。 • 為了讓第一次的查詢結果可以過濾越多的 資料以達到優化的目的, MySQL 的優化器 會儘量使用條件越多的索引。 9/80
  • 11. 練習一 • 試說明 MySQL 的架構。 11/80
  • 12. 進階查詢範例介紹 • Join 語法 • 全文檢索 ( 只適用於 MyISAM) • 行數 • 常用函數介紹 12/80
  • 13. Inner/Natural Join [Join] mysql> select id.id, id.addr, account.name from id, account where id.id = account.id; [Inner Join] mysql> select id.id, id.addr, account.name from id inner join account on id.id = account.id; [Natural Join] mysql> select * from id natural join account; 13/80
  • 14. Left/Right Join [Left Join] mysql> select id.id, id.addr, account.name from id left join account on id.id = account.id; mysql> select * from id left join account using (id); [Left Join] mysql> select account.id, account.name, id.addr from id right join account on id.id = account.id; mysql> select * from id right join account using (id); 14/80
  • 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 self where id.id = self.id; 15/80
  • 16. 全文檢索 mysql> select * from full_text where match(edition) against ('+MySQL -Cluster' in boolean mode); 16/80
  • 17. 行數 mysql> use demo; Database changed mysql> 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/80
  • 19. 流程控制函數 • if • ifnull, nullif • case 19/80
  • 20. if mysql> select s.id, if(s.id > 2, '>2', '<2') from (select 1 as 'id' union select 2 as 'id' union select 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. ifnull / nullif mysql> select s.id, isnull(s.id) as 'isnull', ifnull(s.id, "It's null") as 'ifnull', nullif(s.id, 1) as 'nullif(1)' from (select 1 as 'id' union select 2 as 'id' union select 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 | It's null | NULL | +------+--------+-----------+-----------+ 4 rows in set (0.00 sec) 21/80
  • 22. case mysql> select s.id, case s.id when 1 then 'one' when 2 then 'two' when 3 then 'three' end as 'case testing' from (select 1 as 'id' union select 2 as 'id' union select 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. 字串函數 • length • concat, concat_ws • instr • left, right • lower, upper • trim, ltrim, rtrim • repeat • replace • reverse • space • substring, substring_index • regexp • strcmp 23/80
  • 24. 數值函數 • abs • cos, sin, tan • ceiling, floor, round • exp • format • mod • pow • rand • sign • truncate 24/80
  • 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. 練習二 • 試從 demo.orders 資料表中,將商品分類 為 >20,<20,=20 。 • 如何刪除重複的資料? • 如何利用 SQL 語法做出 Row to Column 的 表格? • 銀行三點半報表。 26/80
  • 27. 管理帳號與權限設定 • 帳號命名規則 • 帳號管理 • 設定密碼 • mysql 客戶端連線設定 • 帳號權限管理 27/80
  • 28. 帳號命名規則 • 帳號最長只能為 16 個字元 • 帳號 @ 主機名稱 28/80
  • 29. 建立新帳號 • 使用 create 指令 mysql> create user stanley@localhost identified by ‘stanley’; • 使用 grant 指令 mysql> grant all on *.* to 'joseph'@'localhost'; ERROR 1133 (42000): Can't 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. 移除帳號 • 使用 drop 指令 mysql> drop user stanley@localhost identified by ‘stanley’; 30/80
  • 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. 設定密碼 • 密碼儲存在 mysql.user • 密碼是以明碼加密的方式儲存 • 加密函式為 password() 32/80
  • 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. 權限設定 • 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. 權限設定 ( 續 ) object_type: TABLE | FUNCTION | PROCEDURE priv_level: * | *.* | db_name.* | db_name.tbl_name | tbl_name | db_name.routine_name user_specification: user [ IDENTIFIED BY [PASSWORD] 'password‘ ] 35/80
  • 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. 移除權限 • 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. 帳號權限管理 • 權限資料表存放在 mysql 資料庫中。 • 與權限相關的資料表: – user – host ( 已廢棄不用 ) – db – tables_priv – columns_priv – procs_priv – proxies_priv 38/80
  • 39. user • user 資料表包含的資訊: – 使用者帳號 – 全域權限 – 其他非權限相關欄位 • 範例: – mysql> use mysql; desc user; – mysql> select * from user; 39/80
  • 40. db • db 資料表包含的資訊: – 資料庫層級的權限資訊 • 範例: – mysql> use mysql; desc db; – mysql> select * from db; 40/80
  • 41. tables_priv • tables_priv 資料表包含的資訊: – 資料表層級的權限資訊 • 範例: – mysql> use mysql; desc tables_priv; – mysql> select * from tables_priv; 41/80
  • 42. columns_priv • columns_priv 資料表包含的資訊: – 欄位層級的權限資訊 • 範例: – mysql> use mysql; desc columns_priv; – mysql> select * from columns_priv; 42/80
  • 43. procs_priv • procs_priv 資料表包含的資訊: – 預儲程序 (Stored Procedure) 層級的權限資訊 • 範例: – mysql> use mysql; desc procs_priv; – mysql> select * from procs_priv; 43/80
  • 44. proxies_priv • proxies_priv 資料表包含的資訊: – 代理人的權限資訊 • 範例: – mysql> use mysql; desc proxies_priv; – mysql> select * from proxies_priv; 44/80
  • 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. my.cnf/my.ini 範例 (1/4) • The following options will be passed to all MySQL clients [client] #password = your_password port = 3306 socket = /tmp/mysql.sock 47/80
  • 48. my.cnf/my.ini 範例 (2/4) • The following options will be passed to mysqldump [mysqldump] quick max_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. my.cnf/my.ini 範例 (3/4) • The following options will be passed to myisamchk [myisamchk] key_buffer_size = 128M sort_buffer_size = 128M read_buffer = 2M write_buffer = 2M 49/80
  • 50. my.cnf/my.ini 範例 (4/4) • The MySQL server [mysqld] port = 3306 socket = /tmp/mysql.sock key_buffer_size = 256M max_allowed_packet = 1M table_open_cache = 256 sort_buffer_size = 1M read_buffer_size = 1M 50/80
  • 51. 練習四 • 練習設定 MySQL 設定檔,並重啟 MySQL 。 • 假設你忘記 root 的密碼,要如何重設 root 的密碼? 51/80
  • 52. 了解 MySQL 中之資料鎖定觀念 與不同層次的鎖定 • 在 MySQL 的鎖定可以分成兩類: – 表鎖定 • MyISAM • Memory • Merge – 列鎖定 • InnoDB 52/80
  • 53. 列鎖定 • 優點: – 當不同的連線在存取不同的資料列時,可以減少鎖定 的衝突。 – 減少資料回復 (Rollback) 時的變動量。 – 可以在單一資料列上做長時間的鎖定。 • 缺點: – 跟表鎖定比較起來,需要較多的記憶體。 – 在鎖定資料表中的大量資料時,其效能比表鎖定來的 慢。因為你需要取得更多的資料鎖。 – 如果你經常在大量的資料中,使用 GROUP BY ,或者 是你經常需要掃過整個資料表。此時,列鎖定會比其 它鎖的效能更慢。 53/80
  • 54. Lock 與 Unlock 的語法 LOCK TABLES tbl_name [[AS] alias] lock_type [, tbl_name [[AS] alias] lock_type] ... lock_type: READ [LOCAL] | [LOW_PRIORITY] WRITE UNLOCK TABLES 54/80
  • 55. Read lock with transaction FLUSH TABLES WITH READ LOCK; START TRANSACTION; SELECT ... ; UNLOCK TABLES; 55/80
  • 56. Lock with Innodb • select … for update; – 防止其它 session 讀取及修改資料 • select … lock in share mode; – 允許其它 session 讀取資料但不允許修改 56/80
  • 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. MySQL 工具,執行備份與回復 備份注意事項: 1. 備份前,先執行指令” FLUSH TABLES tbl_list WITH READ LOCK;” 。 2. 儘量不要使用 mysqldump ,而是用拷貝完整 的 MySQL 資料目錄。 59/80
  • 62. 儲存程式 • 儲存程式包含下列三種: – 儲存程序( Stored Routines ) – 觸發器( Triggers ) – 事件( Events ) 62/80
  • 63. 儲存程序 • 儲存程序包含: – 儲存步驟( Stored Procedure ) – 儲存函式( Stored Function ) • 儲存步驟不會回傳值而儲存函式會有回傳 值。 63/80
  • 64. 儲存程序語法 Syntax: CREATE [DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body CREATE [DEFINER = { user | CURRENT_USER }] FUNCTION sp_name ([func_parameter[,...]]) RETURNS type [characteristic ...] routine_body proc_parameter: [ IN | OUT | INOUT ] param_name type func_parameter: param_name type characteristic: COMMENT 'string' | LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } 64/80
  • 65. 觸發器 • 觸發器是關聯到資料表特定事件的物件, 而事件發生時(例如:插入資料或更新資 料),就會觸發物件反應。 65/80
  • 66. 觸發時機 • 事件前 – before • 事件後 – after 66/80
  • 67. 觸發器事件 • 新增 – insert – load data – replace • 修改 – update • 刪除 – update – replace – 不包含 (drop table, truncate table) 67/80
  • 68. 觸發器語法 • Syntax: CREATE [DEFINER = { user | CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_body 68/80
  • 70. 事件語法 Syntax: CREATE EVENT event_name ON SCHEDULE schedule DO event_body schedule: AT timestamp [+ INTERVAL interval] ... | EVERY interval [STARTS timestamp [+ INTERVAL interval] ...] [ENDS timestamp [+ INTERVAL interval] ...] 70/80
  • 71. 練習七 • 寫一個 hello world 的儲存函式。 mysql> select hello(‘world’); hello world! • 寫一個儲存步驟,以 target 資料表的資料為基準 ,抄寫大量資料到 my_target 資料表上。 • 寫一個觸發器在 after update city 之後 , 將 city_summary 的 summary 欄位值歸零。 • 寫一個事件 , 每 10 秒鐘修改 my_event 資料表的 now 欄位 。 71/80
  • 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
  • 75. explain Syntax: EXPLAIN [EXTENDED | PARTITIONS] SELECT select_options Or: EXPLAIN tbl_name 75/80
  • 77. 運用 MySQL 監控工具以改善伺服器 效能 • 常用的效能監控工具: – Cacti (PHP,MySQL,SNMP 及 RRDTool ) – MysqlReport (Perl) – phpMyAdmin (PHP) – MySQL Administrator (Workbench) 77/80
  • 78. 慢查詢 • 套用記錄慢查詢設定 – log_slow_queries – long_query_time=10 – slow_query_log_file=… 78/80
  • 79. 練習九 • 利用 Workbench 來監控 MySQL 效能。 79/80
  • 80. Q&A 80/80

Editor's Notes

  • #20: Ref: ref_flow_control.sql
  • #24: Ref: ref_string.sql
  • #25: Ref: ref_numeric.sql
  • #26: Ref: ref_date.sql
  • #27: 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
  • #46: Ref: ex_3-1_create user.sql ex_3-2_change password.sql ex_3-3_grant privileges.sql
  • #52: Ref: ex_4-1_init.txt ex_4-2_resetRootPassword.sh
  • #55: Ref: ref_lock.sql
  • #65: Ref: ref_7-1_function.sql ref_7-2_insert_data.sql ref_7-2_procedure.sql
  • #69: Ref: ref_7-3_trigger.sql
  • #72: Ref: ex_7-1_function.sql ex_7-2_procedure.sql ex_7-3_trigger.sql ex_7-4_event.sql
  • #74: Ref: ref_8-1_create_index.sql
  • #76: Ref: ref_8-2_explain.sql