SlideShare ist ein Scribd-Unternehmen logo
1 von 80
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

Weitere ähnliche Inhalte

Was ist angesagt?

真正读懂oracle sql执行计划execution plan v20131025
真正读懂oracle sql执行计划execution plan v20131025真正读懂oracle sql执行计划execution plan v20131025
真正读懂oracle sql执行计划execution plan v20131025maclean liu
 
MySQL 6.0 下的cluster + replicate - 20080220
MySQL 6.0 下的cluster + replicate - 20080220MySQL 6.0 下的cluster + replicate - 20080220
MySQL 6.0 下的cluster + replicate - 20080220Jinrong Ye
 
【Maclean liu技术分享】深入理解oracle中mutex的内部原理
【Maclean liu技术分享】深入理解oracle中mutex的内部原理【Maclean liu技术分享】深入理解oracle中mutex的内部原理
【Maclean liu技术分享】深入理解oracle中mutex的内部原理maclean liu
 
深入了解Memcache
深入了解Memcache深入了解Memcache
深入了解Memcachezubin Jiang
 
16 CoreData
16 CoreData16 CoreData
16 CoreDataTom Fan
 
Discuz技术交流
Discuz技术交流Discuz技术交流
Discuz技术交流pigso
 
MySQL InnoDB 源码实现分析(一)
MySQL InnoDB 源码实现分析(一)MySQL InnoDB 源码实现分析(一)
MySQL InnoDB 源码实现分析(一)frogd
 
Web Caching Architecture and Design
Web Caching Architecture and DesignWeb Caching Architecture and Design
Web Caching Architecture and DesignHo Kim
 
Programming python - part 2
Programming python - part 2Programming python - part 2
Programming python - part 2Che-Cheng Hsu
 
Jdbc4 0 规范技术预研
Jdbc4 0 规范技术预研Jdbc4 0 规范技术预研
Jdbc4 0 规范技术预研lorisjand
 
Oracle管理藝術第1章 在Linux作業體統安裝Oracle 11g
Oracle管理藝術第1章 在Linux作業體統安裝Oracle 11gOracle管理藝術第1章 在Linux作業體統安裝Oracle 11g
Oracle管理藝術第1章 在Linux作業體統安裝Oracle 11gChien Chung Shen
 
PostgreSQL 10 New Features
PostgreSQL 10 New FeaturesPostgreSQL 10 New Features
PostgreSQL 10 New FeaturesJosé Lin
 
美团点评技术沙龙010-美团Atlas实践
美团点评技术沙龙010-美团Atlas实践美团点评技术沙龙010-美团Atlas实践
美团点评技术沙龙010-美团Atlas实践美团点评技术团队
 
dbdao.com 汪伟华 my-sql-replication复制高可用配置方案
dbdao.com 汪伟华 my-sql-replication复制高可用配置方案dbdao.com 汪伟华 my-sql-replication复制高可用配置方案
dbdao.com 汪伟华 my-sql-replication复制高可用配置方案maclean liu
 
MongoDB for C# developer
MongoDB for C# developerMongoDB for C# developer
MongoDB for C# developerdianming.song
 
【诗檀软件 郭兆伟-技术报告】跨国企业级Oracle数据库备份策略
【诗檀软件 郭兆伟-技术报告】跨国企业级Oracle数据库备份策略【诗檀软件 郭兆伟-技术报告】跨国企业级Oracle数据库备份策略
【诗檀软件 郭兆伟-技术报告】跨国企业级Oracle数据库备份策略maclean liu
 
Raising The MySQL Bar-Manyi Lu
Raising The MySQL Bar-Manyi LuRaising The MySQL Bar-Manyi Lu
Raising The MySQL Bar-Manyi Lu郁萍 王
 
Altibase管理培训 安装篇
Altibase管理培训 安装篇Altibase管理培训 安装篇
Altibase管理培训 安装篇小新 制造
 

Was ist angesagt? (20)

真正读懂oracle sql执行计划execution plan v20131025
真正读懂oracle sql执行计划execution plan v20131025真正读懂oracle sql执行计划execution plan v20131025
真正读懂oracle sql执行计划execution plan v20131025
 
MySQL 6.0 下的cluster + replicate - 20080220
MySQL 6.0 下的cluster + replicate - 20080220MySQL 6.0 下的cluster + replicate - 20080220
MySQL 6.0 下的cluster + replicate - 20080220
 
【Maclean liu技术分享】深入理解oracle中mutex的内部原理
【Maclean liu技术分享】深入理解oracle中mutex的内部原理【Maclean liu技术分享】深入理解oracle中mutex的内部原理
【Maclean liu技术分享】深入理解oracle中mutex的内部原理
 
深入了解Memcache
深入了解Memcache深入了解Memcache
深入了解Memcache
 
16 CoreData
16 CoreData16 CoreData
16 CoreData
 
Discuz技术交流
Discuz技术交流Discuz技术交流
Discuz技术交流
 
MySQL InnoDB 源码实现分析(一)
MySQL InnoDB 源码实现分析(一)MySQL InnoDB 源码实现分析(一)
MySQL InnoDB 源码实现分析(一)
 
Mysql集群
Mysql集群Mysql集群
Mysql集群
 
Web Caching Architecture and Design
Web Caching Architecture and DesignWeb Caching Architecture and Design
Web Caching Architecture and Design
 
Programming python - part 2
Programming python - part 2Programming python - part 2
Programming python - part 2
 
Jdbc4 0 规范技术预研
Jdbc4 0 规范技术预研Jdbc4 0 规范技术预研
Jdbc4 0 规范技术预研
 
Oracle管理藝術第1章 在Linux作業體統安裝Oracle 11g
Oracle管理藝術第1章 在Linux作業體統安裝Oracle 11gOracle管理藝術第1章 在Linux作業體統安裝Oracle 11g
Oracle管理藝術第1章 在Linux作業體統安裝Oracle 11g
 
PostgreSQL 10 New Features
PostgreSQL 10 New FeaturesPostgreSQL 10 New Features
PostgreSQL 10 New Features
 
美团点评技术沙龙010-美团Atlas实践
美团点评技术沙龙010-美团Atlas实践美团点评技术沙龙010-美团Atlas实践
美团点评技术沙龙010-美团Atlas实践
 
dbdao.com 汪伟华 my-sql-replication复制高可用配置方案
dbdao.com 汪伟华 my-sql-replication复制高可用配置方案dbdao.com 汪伟华 my-sql-replication复制高可用配置方案
dbdao.com 汪伟华 my-sql-replication复制高可用配置方案
 
MongoDB for C# developer
MongoDB for C# developerMongoDB for C# developer
MongoDB for C# developer
 
Asm+aix
Asm+aixAsm+aix
Asm+aix
 
【诗檀软件 郭兆伟-技术报告】跨国企业级Oracle数据库备份策略
【诗檀软件 郭兆伟-技术报告】跨国企业级Oracle数据库备份策略【诗檀软件 郭兆伟-技术报告】跨国企业级Oracle数据库备份策略
【诗檀软件 郭兆伟-技术报告】跨国企业级Oracle数据库备份策略
 
Raising The MySQL Bar-Manyi Lu
Raising The MySQL Bar-Manyi LuRaising The MySQL Bar-Manyi Lu
Raising The MySQL Bar-Manyi Lu
 
Altibase管理培训 安装篇
Altibase管理培训 安装篇Altibase管理培训 安装篇
Altibase管理培训 安装篇
 

Ähnlich wie MySQL進階介紹

Oracle中比对2张表之间数据是否一致的几种方法
Oracle中比对2张表之间数据是否一致的几种方法Oracle中比对2张表之间数据是否一致的几种方法
Oracle中比对2张表之间数据是否一致的几种方法maclean liu
 
Dog svr
Dog svrDog svr
Dog svryxcwf
 
Mysql权限体系结构 by junsansi
Mysql权限体系结构   by junsansiMysql权限体系结构   by junsansi
Mysql权限体系结构 by junsansiBeenyoung Lee
 
Sql调优clustering factor影响数据删除速度一例
Sql调优clustering factor影响数据删除速度一例Sql调优clustering factor影响数据删除速度一例
Sql调优clustering factor影响数据删除速度一例maclean liu
 
Osc scott linux下的数据库优化for_postgresql
Osc scott linux下的数据库优化for_postgresqlOsc scott linux下的数据库优化for_postgresql
Osc scott linux下的数据库优化for_postgresqlOpenSourceCamp
 
MySQL查询优化浅析
MySQL查询优化浅析MySQL查询优化浅析
MySQL查询优化浅析frogd
 
Sql Cluster Tech Net 0401(Pm)
Sql Cluster Tech Net 0401(Pm)Sql Cluster Tech Net 0401(Pm)
Sql Cluster Tech Net 0401(Pm)bigqiang zou
 
Track A-3 Enterprise Data Lake in Action - 搭建「活」的企業 Big Data 生態架構
Track A-3 Enterprise Data Lake in Action - 搭建「活」的企業 Big Data 生態架構Track A-3 Enterprise Data Lake in Action - 搭建「活」的企業 Big Data 生態架構
Track A-3 Enterprise Data Lake in Action - 搭建「活」的企業 Big Data 生態架構Etu Solution
 
基于Innodb开发的最佳实践
基于Innodb开发的最佳实践基于Innodb开发的最佳实践
基于Innodb开发的最佳实践wubx
 
Mysql handlersocket
Mysql handlersocketMysql handlersocket
Mysql handlersocketpwesh
 
My sql explain & select
My sql explain & selectMy sql explain & select
My sql explain & selectMing-Ying Wu
 
A.oracle 数据字典与脚本初步
A.oracle 数据字典与脚本初步A.oracle 数据字典与脚本初步
A.oracle 数据字典与脚本初步WASecurity
 
Hadoop+spark實作
Hadoop+spark實作Hadoop+spark實作
Hadoop+spark實作FEG
 
Mysql调优
Mysql调优Mysql调优
Mysql调优ken shin
 
Mysql introduction-and-performance-optimization
Mysql introduction-and-performance-optimizationMysql introduction-and-performance-optimization
Mysql introduction-and-performance-optimizationisnull
 
2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江thinkinlamp
 

Ähnlich wie MySQL進階介紹 (20)

Oracle中比对2张表之间数据是否一致的几种方法
Oracle中比对2张表之间数据是否一致的几种方法Oracle中比对2张表之间数据是否一致的几种方法
Oracle中比对2张表之间数据是否一致的几种方法
 
Dog svr
Dog svrDog svr
Dog svr
 
Optimzing mysql
Optimzing mysqlOptimzing mysql
Optimzing mysql
 
Mysql权限体系结构 by junsansi
Mysql权限体系结构   by junsansiMysql权限体系结构   by junsansi
Mysql权限体系结构 by junsansi
 
Enterprise Data Lake in Action
Enterprise Data Lake in ActionEnterprise Data Lake in Action
Enterprise Data Lake in Action
 
Sql调优clustering factor影响数据删除速度一例
Sql调优clustering factor影响数据删除速度一例Sql调优clustering factor影响数据删除速度一例
Sql调优clustering factor影响数据删除速度一例
 
Osc scott linux下的数据库优化for_postgresql
Osc scott linux下的数据库优化for_postgresqlOsc scott linux下的数据库优化for_postgresql
Osc scott linux下的数据库优化for_postgresql
 
MySQL查询优化浅析
MySQL查询优化浅析MySQL查询优化浅析
MySQL查询优化浅析
 
Sql Cluster Tech Net 0401(Pm)
Sql Cluster Tech Net 0401(Pm)Sql Cluster Tech Net 0401(Pm)
Sql Cluster Tech Net 0401(Pm)
 
Track A-3 Enterprise Data Lake in Action - 搭建「活」的企業 Big Data 生態架構
Track A-3 Enterprise Data Lake in Action - 搭建「活」的企業 Big Data 生態架構Track A-3 Enterprise Data Lake in Action - 搭建「活」的企業 Big Data 生態架構
Track A-3 Enterprise Data Lake in Action - 搭建「活」的企業 Big Data 生態架構
 
基于Innodb开发的最佳实践
基于Innodb开发的最佳实践基于Innodb开发的最佳实践
基于Innodb开发的最佳实践
 
Mysql handlersocket
Mysql handlersocketMysql handlersocket
Mysql handlersocket
 
Glider
GliderGlider
Glider
 
Python 温故
Python 温故Python 温故
Python 温故
 
My sql explain & select
My sql explain & selectMy sql explain & select
My sql explain & select
 
A.oracle 数据字典与脚本初步
A.oracle 数据字典与脚本初步A.oracle 数据字典与脚本初步
A.oracle 数据字典与脚本初步
 
Hadoop+spark實作
Hadoop+spark實作Hadoop+spark實作
Hadoop+spark實作
 
Mysql调优
Mysql调优Mysql调优
Mysql调优
 
Mysql introduction-and-performance-optimization
Mysql introduction-and-performance-optimizationMysql introduction-and-performance-optimization
Mysql introduction-and-performance-optimization
 
2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江
 

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

Hinweis der Redaktion

  1. Ref: ref_flow_control.sql
  2. Ref: ref_string.sql
  3. Ref: ref_numeric.sql
  4. Ref: ref_date.sql
  5. 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
  6. Ref: ex_3-1_create user.sql ex_3-2_change password.sql ex_3-3_grant privileges.sql
  7. Ref: ex_4-1_init.txt ex_4-2_resetRootPassword.sh
  8. Ref: ref_lock.sql
  9. Ref: ref_7-1_function.sql ref_7-2_insert_data.sql ref_7-2_procedure.sql
  10. Ref: ref_7-3_trigger.sql
  11. Ref: ex_7-1_function.sql ex_7-2_procedure.sql ex_7-3_trigger.sql ex_7-4_event.sql
  12. Ref: ref_8-1_create_index.sql
  13. Ref: ref_8-2_explain.sql