馬哥的mysql知識

關係模型:(結構化數據模型)
關係模型
實體-關係模型
對象關係模型:基於對象的數據模型
半結構化數據模型:XML(擴展標記語言)
<name>Jerry</name>
<age>50</age>
gender:

    name:
    uid:
    birthdate:

    name:age:gender
    name:uid:birthdate

關係:關係代數運算
交集:
並集:
差集:
全集:
補集:

SQL:Structure Query Language

70
System R: SQL

Ingres, Oracle, Sybase

ANSI: ansi-sql

DML:數據操作語言
INSERT
DELETE
SELECT
UPDATE
DDL:數據定義語言
CREATE
DROP
ALTER

DCL: 數據控制語言
GRANT
REVOKE

訪問權限

RDB對象:
庫、表、索引、視圖、用戶、存儲過程、存儲函數、觸發器、事件調度器

約束
    域約束:數據類型約束
    外鍵約束:引用完整性約束
    主鍵約束:某字段能惟一標識此字段所屬的實體,並且不允許爲空
        一張表中只能有一個主鍵
    惟一性約束:每一行的某字段都不允許出現相同值,可以爲空
        一張表中可以有多個
    檢查性約束: age: int

constraint

/etc/passwd:

數據查詢和存儲:
存儲管理器:
權限及完整性管理器
事務管理器
文件管理器
緩衝區管理器
查詢管理器:
DML解釋器
DDL解釋器
查詢執行引擎

關係運算:
投影:只輸出指定屬性
選擇:只輸出符合條件的行
自然連接:具有相同名字的屬性上所有取值相同的行;
笛卡爾積:
(a+b)*(c+d)=ac+ad+bc+bd
並:集合運算

SQL查詢語句:
sequel-->SQL
SQL-86
SQL-89
SQL-92
SQL-99
SQL-03
SQL-08

SQL語言的組成部分:
DDL
DML
完整性定義語言:DDL的一部分功能
視圖定義:
事務控制:
嵌入式SQL和動態SQL:
授權:DCL

使用程序設計語言如何跟RDBMS交互:
嵌入式SQL:與動態SQL類似,但其語言必須程序編譯時完全確定下來;
ODBC
動態SQL:程序設計語言使用函數(mysql_connect())或者方法與RDBMS服務器建立連接,並進行交互;通過建立連接向SQL服務器發送查詢語句,並將結果保存至變量中而後進行處理;
JDBC

表管理器:負責創建、讀取或修改表定義文件;維護表描述符高速緩存;管理表鎖;
表結構定義文件

表修改模塊:表創建、刪除、重命名、移除、更新或插入之類的操作;
表維護模塊:檢查、修改、備份、恢復、優化(碎片整理)及解析;

行:定長,變長

文件中記錄組織:
堆文件組織:一條記錄可以放在文件中的任何地方;
順序文件組織:根據“搜索碼”值順序存放;
散列文件組織:

表結構定義文件,表數據文件

表空間:table space

數據字典:Data Dictionary
關係的元數據:
關係的名字
字段名字
字段的類型和長度
視圖
約束

    用戶名字,授權,密碼

緩衝區管理器:
緩存置換策略
被釘住的塊

訪問路徑的選擇性:一個訪問路徑的選擇性是所有獲取的頁面數(如果使用這個訪問路徑去獲取所有想要的元組)。如果一個表包含一個與給定條件相匹配的索引,就至少存在兩條訪問路徑:使用索引和掃描整個數據文件。

最有選擇性的路徑是檢索最少頁數的路徑;使用最有選擇性的路徑將使用獲取數據的代價降到最小。而一個訪問路徑的選擇性依賴於選擇條件中的主合取體(與涉及的索引有關),每個合取體就好比表上的一個過濾器,滿足一個給定合取的元組在表中所佔的百分比稱爲縮減因子。

MySQL安裝:
專用軟件包管理器包
deb, rpm
rpm:
RHEL(Oracle Linux), CentOS
SUSE
通用二進制格式包
gcc: x86, x64
源代碼
5.5, 5.6
cmake

MySQL用戶密碼修改:
1、# mysqladmin -u USERNAME -h HOSTNAME password 'NEW_PASS' -p
2、mysql> SET PASSWORD FOR 'USERNAME'@'HOST'=PASSWORD('new_pass');
3、mysql> UPDATE mysql.user SET PASSWORD=PASSWORD('new_pass') WHERE CONDITION;

MySQL安裝:
源碼安裝MySQL
cmake

字符集:
人:00100110 00101010
人:10101011 10010001

漢字:字符集
GBK
GB2312
GB18030
UTF8

排序規則:

性能分析

MySQL客戶端工具:
mysql
mysqldump
mysqladmin
mysqlcheck
mysqlimport

[client]

-u USERNAME
-h HOST
-p ''
--protocol {tcp|socket|pipe|memory}
--port PORT

MySQL非客戶端工具
myisamchk
myisampack

MyISAM:
每表三個文件:
.frm: 表結構
.MYD:表數據
.MYI:表索引

InnoDB:
所有表共享一個表空間文件;
建議:每表一個獨立的表空間文件;
.frm: 表結構
.ibd: 表空間(表數據和表索引)

mysql>

mysql
--user, -u
--host, -h
--password, -p
--port
--protocol
--database DATABASE, -D

其它選項:

mysql>
交互式模式
批處理模式(腳本模式)
mysql < init.sql

mysql>
命令兩類:
客戶端命令
服務器語句:有語句結束符,默認;
\d: 定義語句結束符
//

客戶端命令:
    \c: 提前終止語句執行
    \g: 無論語句結束符是什麼,直接將此語句送至服務器端執行;
    \G: 無論語句結束符是什麼,直接將此語句送到服務器端執行,而且結果以豎排方式顯示;
    \! COMMAND: 執行shell命令
    \W: 語句執行結束後顯示警告信息;
    \#: 對新建的對象,支持補全功能;

mysql>
->
'>
">
`>

補全:
名稱補全

服務器端命令獲取幫助:
help KEYWORD

mysqladmin [options] command [arg] [command [arg]] ...

mysqladmin -uroot -p password 'NEW_PASS'

create DATABASE
drop DATABASE
ping
processlist
status 
    --sleep N:顯示頻率
    --count N: 顯示多個狀態
extended-status: 顯示狀態變量
variables: 顯示服務器變量
flush-privileges: 讓mysqld重讀授權表, 等同於reload;
flush-status: 重置大多數的服務器狀態變量
flush-logs: 二進制和中繼日誌滾動
flush-hosts: 
refresh: 相當於同時執行flush-hosts和flush-logs
shutdown: 關閉mysql服務器進程
version: 服務器版本及當前狀態信息;

start-slave: 啓動複製,啓動從服務器複製線程;
    SQL thread
    IO thread
stop-slave: 關閉複製;

mysqldump, mysqlimport, mysqlcheck

開發視角:
數據類型
約束
數據庫、表、索引、視圖
SELECT

RDBMS:

存儲引擎,也被稱爲表類型:
MyISAM表: 無事務,表鎖
.frm: 表結構定義文件
.MYD: 表數據
.MYI: 索引

InnoDB表:事務,行鎖
.frm: 表結構
.ibd: 表空間(數據和索引)

MySQL:
mysql: MyISAM

SHOW ENGINES
SHOW TABLE STATUS [LIKE ...]

程序語言連接數據的方式:
動態SQL:通過函數或方法與數據庫服務建立連接,
嵌入式SQL:

JDBC, ODBC

客戶端:mysql、mysqladmin、mysqldump、mysqlimport、mysqlcheck

服務器:mysqld, mysqld_safe, mysqld_multi

my.cnf

/etc/my.cnf --> /etc/mysql/my.cnf --> $MYSQL_HOME/my.cnf --> --default-extra-file=/path/to/somefile --> ~/.my.cnf

[mysqld]

[mysqld_safe]

[client]
host =

[mysql]

mysqld --help --verbose

datadir = /mydata/data

hostname.err: 錯誤日誌

1、此前服務未關閉;
2、數據初始化失敗;
3、數據目錄位置錯誤;
4、數據目錄權限問題;

DBA:
開發DBA:數據庫設計、SQL語句、存儲過程、存儲函數、觸發器
管理DBA:安裝、升級、備份、恢復、用戶管理、權限管理、監控、性能分析、基準測試

數據類型:
數值型
精確數值
int
decimal
近似數值
float
double
real
字符型
定長:CHAR(#)、BINARY
變長:VARCHAR(#)、VARBINARY
text, blob

    ENUM, SET

日期時間型
    date, time, datetime, timestamp

域屬性,修改符:

數據類型:
1、存入的值類型;
2、佔據的存儲空間;
3、定長還變長;
4、如何比較及排序;
5、是否能夠索引;

SQL

mysql> SHOW CHARACTER SET;
mysql> SHOW COLLATION;

AUTO_INCREMENT
整型
非空
無符號
主鍵或惟一鍵

CREATE TABLE test(ID INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, Name CHAR(20))

mysql> SELECT LAST_INSERT_ID();

DNS

RRtype CHAR(5)
A, PTR, CNAME, AAAA, MX, NS, SOA, SRV

RRtype ENUM('A','PTR')

SQL模型:
abc, abcdefg
CHAR(3)

MySQL服務器變量
作用域,分爲兩類:
全局變量
SHOW GLOBAL VARIABLES

    會話變量
        SHOW [SESSION] VARIABLES

生效時間,分爲兩類:
    動態:可即時修改
    靜態:
        寫在配置文件中
        通過參數傳遞給mysqld

動態調整參數的生效方式:
    全局:對當前會話無效,只對新建立會話有效;
    會話:即時生效,但只對當前會話有效;

服務器變量:@@變量名
    顯示:SELECT
    設定:SET GLOBAL|SESSION 變量名='value'

/etc/my.cnf

~/.my.cnf

SQL語句:
數據庫

索引
視圖
DML

數據庫:
CREATE DATABASE|SCHEMA [IF NOT EXISTS] db_name [CHARACTER SET=] [COLLATE=]

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

表:
1、直接定義一張空表;
2、從其它表中查詢出數據,並以之創建新表;
3、以其它表爲模板創建一個空表;

CREATE TABLE [IF NOT EXISTS] tb_name (col_name col_defination, constraint )

CREATE TABLE tb1 (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, Name CHAR(20) NOT NULL, Age TINYINT NOT NULL) ENGINE [=] engine_name

CREATE TABLE tb2 (id INT UNSIGNED NOT NULL AUTO_INCREMENT, Name CHAR(20) NOT NULL, Age TINYINT NOT NULL, PRIMARY KEY(id),UNIQUE KEY(name),INDEX(age))

單字段:
PRIMARY KEY
UNIQUE KEY

單或多字段:
PRAMARY KEY (col,...)
UNIQUE KEY (col,...)
INDEX (col,...)

鍵也稱作約束,可用作索引,屬於特殊索引(有特殊限定):B+Tree

CREATE INDEX創建索引

SHOW INDEXES FROM tb_name:顯示指定表上的索引

修改表定義:
ALTER TABLE
添加、刪除、修改字段
添加、刪除、修改索引
改表名
修改表屬性

刪除表:

InnoDB支持外鍵

索引創建:
CREATE INDEX index_name ON tb_name (col,...);

col_name [(length)] [ASC | DESC]

name

11234
11567

DDL:

DML:
SELECT
INSERT INTO
DELETE
UPDATE

SELECT select-list FROM tb WHERE qualification

查詢語句類型:
簡單查詢
多表查詢
子查詢

SELECT * FROM tb_name;

SELECT field1,field2 FROM tb_name; 投影

SELECT [DISTINCT] * FROM tb_name WHERE qualification; 選擇

FROM子句: 要查詢的關係 表、多個表、其它SELECT語句
WHERE子句:布爾關係表達式
=、>、>=、<=、<
邏輯關係:
AND
OR
NOT

BETWEEN ... AND ...
LIKE ‘’
    %: 任意長度任意字符
    _:任意單個字符
REGEXP, RLIKE
IN
IS NULL
IS NOT NULL

ORDER BY field_name {ASC|DESC}

字段別名:AS

LIMIT子句:LIMIT [offset,]Count

聚合:SUM(), MIN(), MAX(), AVG(), COUNT()

GROUP BY: 分組
HAVING qualification

多表查詢:

連接:
    交叉連接:笛卡爾乘積
    自然連接:
    外連接:
        左外連接:... LEFT JOIN ... ON ...
        右外連接: ... RIGHT JOIN ... ON ...
    自連接:

子查詢:
比較操作中使用子查詢:子查詢只能返回單個值;
IN(): 使用子查詢;
在FROM中使用子查詢;

聯合查詢:
UNION

練習:
1、挑選出courses表中沒有被students中的CID2學習的課程的課程名稱;
附加:挑選出沒有教授任何課程的老師,每個老師及其所教授課程的對應關係在courses表中;
找出students表中CID1有兩個或兩個以上同學學習了的同一個門課程的課程名稱;
2、顯示每一位老師及其所教授的課程;沒有教授的課程的保持爲NULL;
3、顯示每一個課程及其相關的老師,沒有老師教授的課程將其老師顯示爲空;
4、顯示每位同學CID1課程的課程名及其講授了相關課程的老師的名稱;
5、

視圖: 存儲下來的SELECT語句;
基於基表的查詢結果;

VIEW

CREATE VIEW

物化視圖:SELECT 

SHOW CREATE

RHCA:

python:

DDL:
SELECT:

選擇:SELECT * FROM tb_name WHERE
布爾表達式
算術運算:
比較操作符:
其它運算符:IN, BETWEEN ... AND ..., LIKE, RLIKE(REGEXP), IS NULL, IS NOT NULL
邏輯運算:AND, OR, NOT, XOR

DISTINCT

投影:SELECT field1, ... FROM tb_name;

ORDER BY field,... {ASC|DESC}

聚合計算:COUNT()、SUM()、MAX()、MIN()和AVG();

GROUP BY field1,...
HAVING

LIMIT [offset],num

多表查詢:
交叉連接
自然連接
WHERE tb1.field=tb2.field
外連接
左外
FROM tb1 LEFT JOIN tb2 ON condition
右外
FROM tb1 RIGHT JOIN tb2 ON condtion
自連接

子查詢:
FROM
WHERE
比較操作符:子查詢只能返回一個字段的單值;
IN:列表(某字段的多個值)

廣義查詢:
DML:
DELETE
INSERT INTO
UPDATE

INSERT INTO tb_name (col1, col2, ...) VALUES (val1, val2, ...)[,(val1, val2, ...),...]
字符型:單引號
數值型:不需要引號
日期時間型:
空值:NULL, ''

REPLACE INTO

DELETE:
DELETE FROM tb_name WHERE condition;

TRUNCATE tb_name: 清空表,並重置AUTOINCREMENT計數器;

UPDATE tb_name SET col1=..., col2=... WHERE

連接管理器:
接受請求
創建線程
認證用戶
建立安全連接

併發控制:
mbox:MDA

C/S: 100
    10分鐘:
        多版本併發控制: MVCC

鎖:
讀鎖:共享鎖
寫鎖:獨佔鎖
LOCK TABLES tb_name {READ|WRITE};
UNLOCK TABLES

鎖粒度:從大到小,MySQL服務器僅支持表級鎖,行鎖需要由存儲引擎完成;
表鎖:
頁鎖:
行鎖:

事務:
RDBMS: ACID (原子性,一致性,隔離性,持久性)

MyISAM:
InnoDB:

隔離性:
隔離級別:
READ UNCOMMITTED:讀未提交
READ COMMITTED:讀提交
REPATABLE READ:可重讀
SERIABLIZABLE:可串行

服務器變量:

動態:
全局變量
修改後不影響當前會話,只對新建的會話有效;
會話變量
僅對當前會話有效,而且是立即生效;

永久有效:修改配置文件

修改:SET {SESSION|GLOBAL} VAR_NAME=‘’;

多事務同時執行:彼此之間互不影響的方式進行並行;
事務之間交互:
通過數據集

事務:CPU, I/O
RDBMS,
ACID:
Automicity:原子性,事務所引起的數據庫操作,要麼都完成,要麼都不執行;
Consistency:一致性,A(3000)-->B(2000)
1:A:3000-->2500,
2: A+B: 4500,
Isolation: 隔離性
事務調度:事務之間影響最小
MVCC:多版本併發控制
Durability:一旦事務成功完成,系統必須保證任何故障都不會引起事務表示出不一致性;
1、事務提交之前就已經寫出數據至持久性存儲;
2、結合事務日誌完成;
事務日誌:順序IO
數據文件:隨機IO

事務的狀態:
    活動的:active
    部分提交的:最後一條語句執行後
    失敗的:
    中止的:
    提交的:

事務:併發執行
1、提高吞吐量和資源利用率
2、減少等待時間

事務調度:
可恢復調度;
無級聯高度:

隔離級別:
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE

併發控制依賴的技術手段:

時間戳
多版本和快照隔離

餓死:
死鎖:

SQL,ODBC

START TANSACTION:啓動
SQL
SQL
COMMIT: 提交
ROLLBACK: 回滾

如果沒有明確啓動事務:
autocommit:能實現自動提交,每一個操作都直接提交;

建議:明確使用事務,並且關閉自動提交;

保存點:SAVEPOINT sid
回滾至保存點:ROLLBACK TO sid

用戶和權限管理

Information about account privileges is stored in the user, db, host, tables_priv, columns_priv, and procs_priv tables in the mysql database. The MySQL server reads the contents of these tables into memory when it starts and reloads them under the circumstances. Access-control decisions are based on the in-memory copies of the grant tables.

user: Contains user accounts, global privileges, and other non-privilege columns.
user: 用戶帳號、全局權限

db: Contains database-level privileges.
db: 庫級別權限

host: Obsolete.
host: 廢棄

tables_priv: Contains table-level privileges.
表級別權限

columns_priv: Contains column-level privileges.
列級別權限

procs_priv: Contains stored procedure and function privileges.
存儲過程和存儲函數相關的權限

proxies_priv: Contains proxy-user privileges.
代理用戶權限

There are several distinctions between the way user names and passwords are used by MySQL and the way they are used by your operating system:

User names, as used by MySQL for authentication purposes, have nothing to do with user names (login names) as used by Windows or Unix.
MySQL user names can be up to 16 characters long.
The server uses MySQL passwords stored in the user table to authenticate client connections using MySQL native authentication (against passwords stored in the mysql.user table).
MySQL encrypts passwords stored in the user table using its own algorithm. This encryption is the same as that implemented by the PASSWORD() SQL function but differs from that used during the Unix login process. 
It is possible to connect to the server regardless of character set settings if the user name and password contain only ASCII characters. 

用戶帳號:br/>用戶名@主機
用戶名:16字符以內
主機:
主機名:www.magedu.com, mysql
IP: 172.16.10.177
網絡地址:
172.16.0.0/255.255.0.0

        通配符:%,_
            172.16.%.%
            %.magedu.com

--skip-name-resolve

權限級別:
全局級別: SUPER、

表: DELETE, ALTER, TRIGGER
列: SELECT, INSERT, UPDATE
存儲過程和存儲函數

字段級別:

臨時表:內存表
heap: 16MB

觸發器:主動數據庫
INSERT, DELETE, UPDATE
user: log

CREATE USER username@host [IDENTIFIED BY 'password']

GRANT

GRANT ALL PRIVILEGES ON [object_type] db.* TO username@'%';

TABLE
| FUNCTION
| PROCEDURE

GRANT EXECUTE ON FUNCTION db.abc TO username@'%';

INSERT INTO mysql.user
mysql> FLUSH PRIVILEGES;

SHOW GRANTS FOR 'username@host';

GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count

--skip-grant-tables
--skip-name-resolve

DROP USER 'username'@'host'

RENAME USER old_name TO new_name

REVOKE

啓動mysqld_safe時傳遞兩個參數:
--skip-grant-tables
--skip-networking

通過更新授權表方式直接修改其密碼,而後移除此兩個選項重啓服務器。

錯誤日誌
log_error
log_warnings
一般查詢日誌:
general_log
general_log_file
log
log_output
慢查詢日誌
long_query_time
log_slow_queries={YES|NO}
slow_query_log
| slow_query_log_file

二進制日誌:任何引起或可能引起數據庫變化的操作;
複製、即時點恢復;
mysqlbinlog

二進制日誌的格式:
    基於語句: statement
    基於行: row
    混合方式: mixed

二進制日誌事件:
    產生的時間
    相對位置

二進制日誌文件:
    索引文件
    二進制日誌文件

查看當前正在使用的二進制日誌文件
mysql> SHOW MASTER STATUS;

mysql> SHOW BINARY LOGS; 

mysql> SHOW BINLOG EVENTS IN '二進制日誌文件名' [FROM pos];

mysql> PURGE BINARY LOGS TO '某二進制日誌文件'

mysqlbinlog
    --start-datetime
    --stop-datetime

    --start-position
    --stop-position

中繼日誌
事務日誌:ACID,將隨機IO轉換爲順序IO;

知識回顧:

用戶及權限管理:br/>'username'@'host'
password()

--skip-grant-tables --skip-networking
UPDATE mysql.user

權限:
    服務管理類:super
    庫: CREATE
    表: DELETE、ALTER
    列: INSERT, SELECT, UPDATE

GRANT 權限,... ON [對象類型] db.{table|routine} TO 'username'@'host' [IDENTIFIED BY 'password'];
REVOKE 權限,... ON [對象類型] db.{table|routine} FROM 'username'@'host';
SHOW GRANTS FOR 'username'@'host';
CREATE USER 'username'@'host' [IDENTIFIED BY 'password'];
DROP USER 'username'@'host';
RENAME USER old_name TO new_name;

日誌:
錯誤日誌:
一般查詢日誌:
慢查詢日誌:
log_output {TABLE|FILE|NONE}
二進制日誌:
複製、即時點恢復
二進制日誌事件:
基於語句:statement
基於行:row
混合方式:mixed

    mysql> SHOW BINARY LOGS;
    mysql> SHOW MASTER STATUS;
    mysql> SHOW BINLOG EVENTS IN '二進制日誌文件' FROM 'position';
    mysql> PURGE BINARY LOGS TO '日誌文件';
    mysql> FLUSH LOGS;

mysqlbinlog 
    --start-position
    --stop-position

    --start-datetime 'yyyy-mm-dd hh:mm:ss'
    --stop-datetime '';

中繼日誌:
    從主服務器的二進制日誌文件中複製而來的事件,並保存爲的日誌文件;
事務日誌:
    事務性存儲引擎用於保證原子性、一致性、隔離性和持久性;
    innodb_flush_log_at_trx_commit:
        0: 每秒同步,並執行磁盤flush操作;
        1:每事務同步,並執行磁盤flush操作;
        2: 每事務同步,但不執行磁盤flush操作;

MyISAM:
不支持事務
表鎖
不支持外鍵
B樹索引、FULLTEXT索引、空間索引
支持表壓縮
.frm
.MYD
.MYI
InnoDB:
事務
行級鎖
B樹索引、聚簇索引、自適應hash索引
表空間,raw磁盤設備;
.frm
.ibd

MRG_MYISAM:

表類型:

MySQL的備份和還原

備份:副本
RAID1,RAID10:保證硬件損壞而不會業務中止;
    DROP TABLE mydb.tb1;

備份類型:
    熱備份、溫備份和冷備份
        熱備份:讀、寫不受影響;
        溫備份:僅可以執行讀操作;
        冷備份:離線備份;讀、寫操作均中止;

    物理備份和邏輯備份
        物理備份:複製數據文件;
        邏輯備份:將數據導出至文本文件中;

    完全備份、增量備份和差異備份;
        完全備份:備份全部數據;
        增量備份:僅備份上次完全備份或增量備份以後變化的數據;
        差異備份:僅備份上次完全備份以來變化的數據;

在線:物理完全備份

還原:

    備份什麼:
        數據、配置文件、二進制日誌、事務日誌

熱備份:
MyISAM: 溫備份
InnoDB: xtrabackup, mysqldump

MySQL --> 從:

物理備份:速度快
邏輯備份:速度慢、丟失浮點數精度;方便使用文本處理工具直接對其處理、可移植能力強;

備份策略:完全+增量;完全+差異

MySQL備份工具:
mysqldump: 邏輯備份工具、MyISAM(溫)、InnoDB(熱備份)
mysqlhotcopy:物理備份工具、溫備份

文件系統工具:
cp:冷備
lv: 邏輯卷的快照功能,幾乎熱備;
mysql> FLUSH TABLES;
mysql> LOCK TABLES

創建快照:釋放鎖,而後複製數據

InnoDB: 

第三組工具:
ibbackup: 商業工具
xtrabackup: 開源工具

mysqldump: 邏輯備份
mysqldump(完全備份)+ 二進制日誌
完全+增量:

備份單個數據庫,或庫中特定表
mysqldump DB_NAME [tb1] [tb2]

--master-data={0|1|2}
0: 不記錄二進制日誌文件及路位置;
1:以CHNAGE MASTER TO的方式記錄位置,可用於恢復後直接啓動從服務器;
2:以CHANGE MASTER TO的方式記錄位置,但默認爲被註釋;

--lock-all-tables:鎖定所有表

--flush-logs: 執行日誌flush;

如果指定庫中的表類型均爲InnoDB,可使用--single-transaction啓動熱備;

備份多個庫:
--all-databases: 備份所有庫
--databases DB_NAME,DB_NAME,...: 備份指定庫

--events
--routines
--triggers

備份策略:每週完全+每日增量
完全備份:mysqldump
增量備份:備份二進制日誌文件(flush logs)

expire_logs_days={0..99}
設定二進制日誌的過期天數,超出此天數的二進制日誌文件將被自動刪除。默認爲0,表示不啓用過期自動刪除功能。如果啓用此功能,自動刪除工作通常發生在MySQL啓動時或FLUSH日誌時。作用範圍爲全局,可用於配置文件,屬動態變量。

general_log={ON|OFF}
設定是否啓用查詢日誌,默認值爲取決於在啓動mysqld時是否使用了--general_log選項。如若啓用此項,其輸出位置則由--log_output選項進行定義,如果log_output的值設定爲NONE,即使用啓用查詢日誌,其也不會記錄任何日誌信息。作用範圍爲全局,可用於配置文件,屬動態變量。

general_log_file=FILE_NAME
查詢日誌的日誌文件名稱,默認爲“hostname.log"。作用範圍爲全局,可用於配置文件,屬動態變量。

binlog-format={ROW|STATEMENT|MIXED}
指定二進制日誌的類型,默認爲STATEMENT。如果設定了二進制日誌的格式,卻沒有啓用二進制日誌,則MySQL啓動時會產生警告日誌信息並記錄於錯誤日誌中。作用範圍爲全局或會話,可用於配置文件,且屬於動態變量。

log={YES|NO}
是否啓用記錄所有語句的日誌信息於一般查詢日誌(general query log)中,默認通常爲OFF。MySQL 5.6已經棄用此選項。

log-bin={YES|NO}
是否啓用二進制日誌,如果爲mysqld設定了--log-bin選項,則其值爲ON,否則則爲OFF。其僅用於顯示是否啓用了二進制日誌,並不反應log-bin的設定值。作用範圍爲全局級別,屬非動態變量。

log_bin_trust_function_creators={TRUE|FALSE}
此參數僅在啓用二進制日誌時有效,用於控制創建存儲函數時如果會導致不安全的事件記錄二進制日誌條件下是否禁止創建存儲函數。默認值爲0,表示除非用戶除了CREATE ROUTING或ALTER ROUTINE權限外還有SUPER權限,否則將禁止創建或修改存儲函數,同時,還要求在創建函數時必需爲之使用DETERMINISTIC屬性,再不然就是附帶READS SQL DATA或NO SQL屬性。設置其值爲1時則不啓用這些限制。作用範圍爲全局級別,可用於配置文件,屬動態變量。

log_error=/PATH/TO/ERROR_LOG_FILENAME
定義錯誤日誌文件。作用範圍爲全局或會話級別,可用於配置文件,屬非動態變量。

log_output={TABLE|FILE|NONE}
定義一般查詢日誌和慢查詢日誌的保存方式,可以是TABLE、FILE、NONE,也可以是TABLE及FILE的組合(用逗號隔開),默認爲TABLE。如果組合中出現了NONE,那麼其它設定都將失效,同時,無論是否啓用日誌功能,也不會記錄任何相關的日誌信息。作用範圍爲全局級別,可用於配置文件,屬動態變量。

log_query_not_using_indexes={ON|OFF}
設定是否將沒有使用索引的查詢操作記錄到慢查詢日誌。作用範圍爲全局級別,可用於配置文件,屬動態變量。

log_slave_updates
用於設定複製場景中的從服務器是否將從主服務器收到的更新操作記錄進本機的二進制日誌中。本參數設定的生效需要在從服務器上啓用二進制日誌功能。

log_slow_queries={YES|NO}
是否記錄慢查詢日誌。慢查詢是指查詢的執行時間超出long_query_time參數所設定時長的事件。MySQL 5.6將此參數修改爲了slow_query_log。作用範圍爲全局級別,可用於配置文件,屬動態變量。

log_warnings=#
設定是否將警告信息記錄進錯誤日誌。默認設定爲1,表示啓用;可以將其設置爲0以禁用;而其值爲大於1的數值時表示將新發起連接時產生的“失敗的連接”和“拒絕訪問”類的錯誤信息也記錄進錯誤日誌。

long_query_time=#
設定區別慢查詢與一般查詢的語句執行時間長度。這裏的語句執行時長爲實際的執行時間,而非在CPU上的執行時長,因此,負載較重的服務器上更容易產生慢查詢。其最小值爲0,默認值爲10,單位是秒鐘。它也支持毫秒級的解析度。作用範圍爲全局或會話級別,可用於配置文件,屬動態變量。

max_binlog_cache_size{4096 .. 18446744073709547520}
二進定日誌緩存空間大小,5.5.9及以後的版本僅應用於事務緩存,其上限由max_binlog_stmt_cache_size決定。作用範圍爲全局級別,可用於配置文件,屬動態變量。

max_binlog_size={4096 .. 1073741824}
設定二進制日誌文件上限,單位爲字節,最小值爲4K,最大值爲1G,默認爲1G。某事務所產生的日誌信息只能寫入一個二進制日誌文件,因此,實際上的二進制日誌文件可能大於這個指定的上限。作用範圍爲全局級別,可用於配置文件,屬動態變量。

max_relay_log_size={4096..1073741824}
設定從服務器上中繼日誌的體積上限,到達此限度時其會自動進行中繼日誌滾動。此參數值爲0時,mysqld將使用max_binlog_size參數同時爲二進制日誌和中繼日誌設定日誌文件體積上限。作用範圍爲全局級別,可用於配置文件,屬動態變量。

innodb_log_buffer_size={262144 .. 4294967295}
設定InnoDB用於輔助完成日誌文件寫操作的日誌緩衝區大小,單位是字節,默認爲8MB。較大的事務可以藉助於更大的日誌緩衝區來避免在事務完成之前將日誌緩衝區的數據寫入日誌文件,以減少I/O操作進而提升系統性能。因此,在有着較大事務的應用場景中,建議爲此變量設定一個更大的值。作用範圍爲全局級別,可用於選項文件,屬非動態變量。

innodb_log_file_size={108576 .. 4294967295}
設定日誌組中每個日誌文件的大小,單位是字節,默認值是5MB。較爲明智的取值範圍是從1MB到緩存池體積的1/n,其中n表示日誌組中日誌文件的個數。日誌文件越大,在緩存池中需要執行的檢查點刷寫操作就越少,這意味着所需的I/O操作也就越少,然而這也會導致較慢的故障恢復速度。作用範圍爲全局級別,可用於選項文件,屬非動態變量。

innodb_log_files_in_group={2 .. 100}
設定日誌組中日誌文件的個數。InnoDB以循環的方式使用這些日誌文件。默認值爲2。作用範圍爲全局級別,可用於選項文件,屬非動態變量。

innodb_log_group_home_dir=/PATH/TO/DIR
設定InnoDB重做日誌文件的存儲目錄。在缺省使用InnoDB日誌相關的所有變量時,其默認會在數據目錄中創建兩個大小爲5MB的名爲ib_logfile0和ib_logfile1的日誌文件。作用範圍爲全局級別,可用於選項文件,屬非動態變量。

relay_log=file_name
設定中繼日誌的文件名稱,默認爲host_name-relay-bin。也可以使用絕對路徑,以指定非數據目錄來存儲中繼日誌。作用範圍爲全局級別,可用於選項文件,屬非動態變量。

relay_log_index=file_name
設定中繼日誌的索引文件名,默認爲爲數據目錄中的host_name-relay-bin.index。作用範圍爲全局級別,可用於選項文件,屬非動態變量。

relay-log-info-file=file_name
設定中繼服務用於記錄中繼信息的文件,默認爲數據目錄中的relay-log.info。作用範圍爲全局級別,可用於選項文件,屬非動態變量。

relay_log_purge={ON|OFF}
設定對不再需要的中繼日誌是否自動進行清理。默認值爲ON。作用範圍爲全局級別,可用於選項文件,屬動態變量。

relay_log_space_limit=#
設定用於存儲所有中繼日誌文件的可用空間大小。默認爲0,表示不限定。最大值取決於系統平臺位數。作用範圍爲全局級別,可用於選項文件,屬非動態變量。

slow_query_log={ON|OFF}
設定是否啓用慢查詢日誌。0或OFF表示禁用,1或ON表示啓用。日誌信息的輸出位置取決於log_output變量的定義,如果其值爲NONE,則即便slow_query_log爲ON,也不會記錄任何慢查詢信息。作用範圍爲全局級別,可用於選項文件,屬動態變量。

slow_query_log_file=/PATH/TO/SOMEFILE
設定慢查詢日誌文件的名稱。默認爲hostname-slow.log,但可以通過--slow_query_log_file選項修改。作用範圍爲全局級別,可用於選項文件,屬動態變量。

sql_log_bin={ON|OFF}
用於控制二進制日誌信息是否記錄進日誌文件。默認爲ON,表示啓用記錄功能。用戶可以在會話級別修改此變量的值,但其必須具有SUPER權限。作用範圍爲全局和會話級別,屬動態變量。

sql_log_off={ON|OFF}
用於控制是否禁止將一般查詢日誌類信息記錄進查詢日誌文件。默認爲OFF,表示不禁止記錄功能。用戶可以在會話級別修改此變量的值,但其必須具有SUPER權限。作用範圍爲全局和會話級別,屬動態變量。

sync_binlog=#
設定多久同步一次二進制日誌至磁盤文件中,0表示不同步,任何正數值都表示對二進制每多少次寫操作之後同步一次。當autocommit的值爲1時,每條語句的執行都會引起二進制日誌同步,否則,每個事務的提交會引起二進制日誌同步。

知識回顧:

1、hot(r/w)、warm(r)、cold

2、logical, raw
mysql:
raw:

3、備份數據集
full
incremental
differential

二進制日誌:
format:
statment
row
mixed

mysqldump:
--databases DB1,DB2,...
--all-databases

MyISAM: 溫備份
--lock-all-tables
--lock-tables

InnoDB: 熱備份
--single-transaction

--flush-logs

--events
--routines
--triggers

--master-data={0|1|2}

邏輯備份:
1、浮點數據丟失精度;
2、備份出的數據更佔用存儲空間;壓縮後可大大節省空間;
3、不適合對大數據庫做完全備份;

對InnoDB:
mysql> FLUSH TABLES WITH READ LOCK;

MVCC, REPEATABLE-READ
--single-transaction

備份:
SELECT * INTO OUTFILE '/path/to/somefile.txt' FROM tb_name [WHERE clause];

還原:
LOAD DATA INFILE '/path/to/somefile.txt' INTO TABLE tb_name;

幾乎熱備:LVM
snapshot:

前提:
    1、數據文件要在邏輯捲上;
    2、此邏輯卷所在卷組必須有足夠空間使用快照卷;
    3、數據文件和事務日誌要在同一個邏輯捲上;

步驟:
    1、打開會話,施加讀鎖,鎖定所有表;
        mysql> FLUSH TABLES WITH READ LOCK;
        mysql> FLUSH LOGS;
    2、通過另一個終端,保存二進制日誌文件及相關位置信息;
        $ mysql -uroot -p -e 'SHOW MASTER STATUS\G' > /path/to/master.info
    3、創建快照卷
        # lvcreate -L # -s -p r -n LV_NAME /path/to/source_lv
    4、釋放鎖
        mysql> UNLOCK TABLES;
    5、掛載快照卷,備份
        mount 
        cp
    6、刪除快照卷;
    7、增量備份二進制日誌;

二進制日誌相關的幾個選項:

innodb_support_xa={TRUE|FLASE}
存儲引擎事務在存儲引擎內部被賦予了ACID屬性,分佈式(XA)事務是一種高層次的事務,它利用“準備”然後“提交”(prepare-then-commit)兩段式的方式將ACID屬性擴展到存儲引擎外部,甚至是數據庫外部。然而,“準備”階段會導致額外的磁盤刷寫操作。XA需要事務協調員,它會通知所有的參與者準備提交事務(階段1)。當協調員從所有參與者那裏收到“就緒”信息時,它會指示所有參與者進行真正的“提交”操作。
此變量正是用於定義InnoDB是否支持兩段式提交的分佈式事務,默認爲啓用。事實上,所有啓用了二進制日誌的並支持多個線程同時向二進制日誌寫入數據的MySQL服務器都需要啓用分佈式事務,否則,多個線程對二進制日誌的寫入操作可能會以與原始次序不同的方式完成,這將會在基於二進制日誌的恢復操作中或者是從服務器上創建出不同原始數據的結果。因此,除了僅有一個線程可以改變數據以外的其它應用場景都不應該禁用此功能。而在僅有一個線程可以修改數據的應用中,禁用此功能是安全的並可以提升InnoDB表的性能。作用範圍爲全局和會話級別,可用於選項文件,屬動態變量。

sync_binlog = 1

mysql> LOCK TABLES mydb.tb1 READ, mydb.tb2 READ, ...
mysql> FLUSH TABLES mydb.tb1, mydb.tb2, ...

mysq> SET SQL_LOG_BIN=0;
mysql> SOURCE somefile.sql;
mysql> SET SQL_LOG_BIN=1;

percona:
ibbackup: InnoDB online physical backup
full
incremental
MyISAM: warm backup, full

$5000

mysqldump

LVM --> mylvmbackup(perl scripts)

percona:
xtrabackup
xtradb: innodb的增強版
innodb

xtrabackup+二進制日誌;

mysql:

二進制日誌
事務日誌
錯誤日誌
一般查詢日誌
中繼日誌
慢查詢日誌

二進制日誌:
數據目錄
mysql-bin.XXXXXX
滾動:達到最大上限,flush logs,服務器重啓
mysql> PURGE

二進制日誌的格式:
    statement
    row
    mixed

mysql-bin.index: 二進制日誌文件索引文件

mysql> SHOW MASTER STATUS;
mysql> SHOW BINARY LOGS;
mysql> SHOW BINLOG EVENTS IN "file";

event:
    timestamp
    position, offset,OPERATION, server-id

即時點還原:
MySQL: tx1

MySQL隔離級別:
    READ-UNCOMMITTED
    READ-COMMITTED
    REPEATABLE-READ
    SERIALIZABLE

複製的作用:
輔助實現備份
高可用
異地容災
scale out:分攤負載

主從架構中,不使用MySQL代理,如何讓主的負責寫,從的負責讀?

雙主:無法減輕寫操作;

雙主模型:

tutors: name, age, gender, tid

tom 10
jerry 30

A: UPDATE tutors SET name=Jerry where age=10 ;
B: UPDATE tutors SET age=30 WHERE name=tom;

tid:
1
3
5
7
9
11

2
4

讀寫分離:
mysql-proxy
amoeba

數據拆分:
cobar:

master: slave
1-->N
slave: master
1-->N X

一個從只能屬於一個主服務器

MySQL 5.5:
MySQL 5.6: gtid, multi-thread replication

配置MySQL複製基本步驟:

一、master

1、啓用二進制日誌
log-bin = master-bin
log-bin-index = master-bin.index

2、選擇一個惟一server-id
server-id = {0-2^32}

3、創建具有複製權限的用戶
REPLICATION SLAVE
REPLICATION CLIENT

二、slave

1、啓用中繼日誌
relay-log = relay-log
relay-log-index =

2、選擇一個惟一的server-id
server-id = {0-2^32}

3、連接至主服務器,並開始複製數據;
mysql> CHANGER MASTER TO MASTER_HOST='',MASTER_PORT='',MASTER_LOG_FILE='',MASTER_LOG_FIEL_POS='',MASTER_USER='',MASTER_PASSWORD='';
mysql> START SLAVE;

mysql> START SLAVE IO_Thread; 
mysql> START SLAVE SQL_Thread; 

複製線程:
master: dump
slave: IO_Thread, SQL_Thread

read-only = YES
在從服務器上設定,但對具有SUPER權限的用戶不生效;

sync-binlog = ON
在主服務器上設定,用於事務安全;

percona: percona-tools
mattkit-tools

SSL:
Dual MASTER:

1、從服務器能不能執行“寫”操作?
CREATE
INSERT
如何阻止寫從服務器?
my.cnf
[mysqld]
read-only = 1

不能阻止 SQL Thread
如果某用戶有SUPER權限,則不被阻止;
mysql> FLUSH TABLES WITH READ LOCK;

2、一個主服務器可否多從?可以

    一從是否多主?不行

3、主-->從:異步

mysql 5.5 google 補丁
半同步: semisync

半同步如果無法在指定時間完成-->自動 降到異步模式;

4、如何從服務器的mysql服務在啓動時候不要自動啓動從服務線程?

master.info
relay-log.info

在從服務器上:
[mysqld]
skip-slave-start=1

5、數據庫複製過濾

在主服務器上實現:
binlog-do-db=testdb
binlog-do-db=mydb

binlog-ignore-db=mysql

主服務器
[mysqld]
binlog-do-db=
OR
binlog-ignore-db=

在主服務器過濾:任何不涉及到數據庫相關的寫操作都不會被記錄到二進制日誌當中;

從服務器:
replicate_do_db
rpplicate_ignore_db

replicate_do_table
replicate_ignore_table

replicate_wild_do_table
replicate_wild_ignore_table

在從服務器上只複製mageedu一個數據庫:

[mysqld]
replicate_do_db=mageedu
replicate_do_db=mysql

設置半同步步驟:

在Master和Slave的mysql命令行運行如下代碼:

On Master

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000;

On Slave

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;

在Master和Slave的my.cnf中編輯:

On Master

[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000 # 1 second

On Slave

[mysqld]
rpl_semi_sync_slave_enabled=1

也可通過設置全局變量的方式來設置,如下:

set global rpl_semi_sync_master_enabled=1

取消加載插件

mysql> UNINSTALL PLUGIN rpl_semi_sync_master;

查看從服務器上的semi_sync是否開啓:
mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%';

查看主服務器上的semi_sync是否開啓,注意clients 變爲1 ,證明主從半同步複製連接成功:
mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%';

6、主服務器崩潰,事務已經提交-->寫入二進制日誌;

在主-從架構上建議使用的配置:

主服務器:
sync_binlog=1
innodb_flush_logs_at_trx_commit=1

從服務器:
skip_slave_start=1
read_only=1

SSL:

REQURIED SSL

auto_increment

1,3,5

2,4,8

設置主-主複製:
1、在兩臺服務器上各自建立一個具有複製權限的用戶;
2、修改配置文件:

主服務器上

[mysqld]
server-id = 10
log-bin = mysql-bin
relay-log = relay-mysql
relay-log-index = relay-mysql.index
auto-increment-increment = 2
auto-increment-offset = 1

從服務器上

[mysqld]
server-id = 20
log-bin = mysql-bin
relay-log = relay-mysql
relay-log-index = relay-mysql.index
auto-increment-increment = 2
auto-increment-offset = 2

3、如果此時兩臺服務器均爲新建立,且無其它寫入操作,各服務器只需記錄當前自己二進制日誌文件及事件位置,以之作爲另外的服務器複製起始位置即可

server1|mysql> SHOW MASTER STATUS\G
** 1. row ***
File: mysql-bin.000001
Position: 710
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)

server2|mysql> SHOW MASTER STATUS\G
mysql> SHOW MASTER STATUS\G
1. row
File: mysql-bin.000003
Position: 811
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)

4、各服務器接下來指定對另一臺服務器爲自己的主服務器即可:
server1|mysql> CHANGE MASTER TO ...,MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=811

server2|mysql> CHANGE MASTER TO ...,MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=710

A: 查看B的二進制日誌文件及位置,並以及作爲自己的複製起點;
B:

配置主從複製的基本步驟:

1、master
啓用二進制日誌、惟一server-id、具有複製權限的用戶(REQUIRE SSL);

2、slave
啓用中繼日誌、惟一server-id、連接主服務器並啓動複製線程(IO_THREAD, SQL_THREAD);

MySQL讀寫分離:
master: 寫
slave: 只讀

mysql-proxy、amoeba

cobar:

php --> MySQL

LAMP: php語言開發的應用程序

blackhole: 存儲引擎,多級複製時,

memcached: 緩存服務器
key: value

O(1)

MySQL: semisync_master.so, semisync_slave.so

寫博客:
MySQL主從複製原理、主從複製、半同步複製、基於SSL複製或主主複製;
MySQL-5.6主從複製;(GTID, 多線程複製);
MySQL-proxy實現讀寫分離;

MySQL: 數據庫複製過濾

MySQL-5.6: GTID
slave-parallel-workers=0
0: 表示禁用多線程功能;

/etc/mysql.cnf

[mysql-proxy]

主索引:包含記錄的文件按某個搜索碼指定的順序進行排序,此索引即爲主索引(primary index),也稱爲聚集索引(clustering index)。

搜索碼指定的順序與文件中記錄的物理順序不同的索引稱爲輔助索引(secondary index),或者非聚集索引(non-clustering index)。

靜態散列:

桶:表示能存儲一條或多條記錄的一個存儲單位。通常一個桶就是一個磁盤塊,但也可能小於或大於一個磁盤塊。令K表示所有搜索碼的集合,令B爲所有桶地址的集合,散列函數h是一個從K到B的函數。爲了插入一條搜索碼爲k的記錄,通過計算h(k),可得出存儲該記錄的桶的地址。

桶溢出:發生的原因(1、桶不足;2、偏斜)

動態散列:
有多種實現技術,其中之一即爲可擴充散列,它能夠通過桶的分裂或合併來適應數據庫大小的變化。

查詢代價的度量:
傳送磁盤塊數和搜索磁盤塊數;

查詢處理:語法分析與翻譯-->優化-->執行

選擇運算:
線性搜索:全表掃描,是存取數據的最低級操作;它涉及一次初始搜索,及包含記錄的文件的所有塊傳輸;
B+樹主索引,碼屬性等值比較:索引查找穿越樹的高度,再加上一次IO來取記錄;
B+樹主索引,非碼屬性等會比較:樹的每一次一次搜索,第一個塊一次搜索;
B+樹輔助索引,碼屬性等值比較;
B+樹輔助索引,非碼屬性等值比較;每條記錄可能在不同的塊上,這需要每條記錄一次搜索;
B+樹主索引,比較:對於A>=v,在索引中找到第一個滿足條件A=v的記錄,而後依次讀取其後的所有記錄即可;
B+樹輔助索引,比較:由於連續的記錄可能存儲於不同的磁盤塊中,因此每取一條記錄可能就需要一次IO操作;

複雜選擇的實現:(合取(交)、析取(並)、取反)
利用一個索引的合取選擇:首先判斷是否存在某個簡單條件中的某個屬性上的一個存取路徑,若存在就使用上面選擇運算中除第一個之外的方式檢索滿足該條件的記錄,然後在內存緩衝區中,通過測試每條檢索到的記錄是否滿足其餘的簡單條件來最終完成操作。
使用組合索引的合取選擇:如果選擇指定的是兩個或多個屬性上的等值條件,並且在這些屬性字段的組合上又存在組合索引,則可以直接搜索索引;
通過標識符的交實現合取選擇:該算法要求各個條件所涉及的字段上有帶記錄指針的索引;此算法對每個索引進行掃描,獲取那些指向滿足單個條件的記錄的指針,所有檢索到的指針的交集就是那些滿足合取條件的指針的集合。
通過標識符的交實現析取選擇:該算法要求各個條件所涉及的字段上有帶記錄指針的索引;此算法對每個索引進行掃描,獲取那些指向滿足單個條件的記錄的指針,所有檢索到的指針的交集就是那些滿足析取條件的指針的集合。

排序:
數據排序在RDBMS中有重要的作用:一是SQL查詢會指明對結果進行排序,另一個當輸入的關係已排序時,關係運算中的一些運算(如連接運算)能夠得到高效實現。

對不能全部放在內存中的關係的排序稱爲外排序。外排序中最常用的技術是外部歸併排序算法。

連接運算:
嵌套循環連接:代價很大;
塊嵌套循環連接:緩衝區太小不能完全容納任何一個關係時,使用此算法;
索引嵌套循環連接:內層關係上有索引時可使用此算法;
歸併連接:排序-歸併-連接
散列連接:可用於實現自然連接和等值連接;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章