linux第九周總結

linux學習第九周總結

本週的內容重中之重,數據庫MySQL,

一、簡介

MySQL是一個關係型數據庫管理系統,由瑞典MySQL AB 公司開發,目前屬於 Oracle 旗下產品。MySQL 是最流行的關係型數據庫管理系統之一,在 WEB 應用方面,MySQL是最好的 RDBMS (Relational Database Management System,關係數據庫管理系統) 應用軟件。

MySQL是一種關係數據庫管理系統,關係數據庫將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加了速度並提高了靈活性。

MySQL所使用的 SQL 語言是用於訪問數據庫的最常用標準化語言。MySQL 軟件採用了雙授權政策,分爲社區版和商業版,由於其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型網站的開發都選擇 MySQL 作爲網站數據庫。

由於其社區版的性能卓越,搭配 PHP 和 Apache 可組成良好的開發環境。

應用環境

與其他的大型數據庫例如 Oracle、DB2、SQL Server等相比,MySQL [1] 自有它的不足之處,但是這絲毫也沒有減少它受歡迎的程度。對於一般的個人使用者和中小型企業來說,MySQL提供的功能已經綽綽有餘,而且由於 MySQL是開放源碼軟件,因此可以大大降低總體擁有成本

系統特性編輯
1. [2] 使用 C和 C++編寫,並使用了多種編譯器進行測試,保證了源代碼的可移植性。
2.支持 AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows等多種操作系統。
3.爲多種編程語言提供了 API。這些編程語言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby,.NET和 Tcl 等。
4.支持多線程,充分利用 CPU 資源。
5.優化的 SQL查詢算法,有效地提高查詢速度。
6.既能夠作爲一個單獨的應用程序應用在客戶端服務器網絡環境中,也能夠作爲一個庫而嵌入到其他的軟件中。
7.提供多語言支持,常見的編碼如中文的 GB 2312、BIG5,日文的 Shift_JIS等都可以用作數據表名和數據列名。
8.提供 TCP/IP、ODBC 和 JDBC等多種數據庫連接途徑。
9.提供用於管理、檢查、優化數據庫操作的管理工具。
10.支持大型的數據庫。可以處理擁有上千萬條記錄的大型數據庫。
11.支持多種存儲引擎。
12.MySQL 是開源的,所以你不需要支付額外的費用。
13.MySQL 使用標準的 SQL數據語言形式。
14.MySQL 對 PHP 有很好的支持,PHP是比較流行的 Web 開發語言。
15.MySQL是可以定製的,採用了 GPL協議,你可以修改源碼來開發自己的 MySQL 系統。
16.在線 DDL/更改功能,數據架構支持動態應用程序和開發人員靈活性(5.6新增)
17.複製全局事務標識,可支持自我修復式集羣(5.6新增)
18.複製無崩潰從機,可提高可用性(5.6新增)
19.複製多線程從機,可提高性能(5.6新增)
20.3倍更快的性能(5.7 [3] 新增)
21.新的優化器(5.7新增)
22.原生JSON支持(5.7新增)
23.多源複製(5.7新增)
24.GIS的空間擴展 [4] (5.7新增)

二、安裝方式

1.RPM安裝
    RPM包安裝
    CentOS 7:安裝光盤直接提供
        mariadb-server   服務器包
        mariadb          客戶端工具包
CentOS 6
提高安全性
    mysql_secure_installation
        設置數據庫管理員root口令
        禁止root遠程登錄
        刪除anonymous用戶帳號
        刪除test數據庫
客戶端程序:
    mysql: 交互式的CLI工具
    mysqldump:備份工具,基於mysql協議向mysqld發起查詢請求,並將查得的所有數據轉換成insert等寫操作語句保存文本文件中
    mysqladmin:基於mysql協議管理mysqld
    mysqlimport:數據導入工具
MyISAM存儲引擎的管理工具:
    myisamchk:檢查MyISAM庫
    myisampack:打包MyISAM表,只讀
服務器端程序
    mysqld_safe
    mysqld
    mysqld_multi 多實例 ,示例:mysqld_multi --example
mysql用戶賬號由兩部分組成:
    'USERNAME'@'HOST‘
說明:
    HOST限制此用戶可通過哪些遠程主機連接mysql服務器
        支持使用通配符:
            % 匹配任意長度的任意字符
            172.16.0.0/255.255.0.0 或 172.16.%.%
            _ 匹配任意單個字符
服務器監聽的兩種socket地址:
    ip socket: 監聽在tcp的3306端口,支持遠程通信
    unix sock: 監聽在sock文件上,僅支持本機通信
        如:/var/lib/mysql/mysql.sock)
    說明:host爲localhost,127.0.0.1時自動使用unix sock
偵聽3306/tcp端口可以在綁定有一個或全部接口IP上
vim /etc/my.cnf
    [mysqld]
    skip-networking=1
關閉網絡連接,只偵聽本地客戶端, 所有和服務器的交互都通過一個socket實現,socket的配置存放在/var/lib/mysql/mysql.sock) 可在/etc/my.cnf修改

2.二進制安裝

二進制格式安裝過程
(1) 準備用戶
    groupadd -r -g 306 mysql
    useradd -r -g 306 -u 306 –d /data/mysql mysql
(2) 準備數據目錄,建議使用邏輯卷
    mkdir /data/mysql
    chown mysql:mysql /data/mysql
(3) 準備二進制程序
    tar xf mariadb-VERSION-linux-x86_64.tar.gz -C /usr/local
    cd /usr/local
    ln -sv mariadb-VERSION mysql
    chown -R root:mysql /usr/local/mysql/
(5)創建數據庫文件
    cd /usr/local/mysql/
    ./scripts/mysql_install_db --datadir=/data/mysql --user=mysql
(6)準備服務腳本,並啓動服務
    cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld
    chkconfig --add mysqld
    service mysqld start
(7)PATH路徑
    echo ‘PATH=/user/local/mysql/bin:$PATH’ > /etc/profile.d/mysql
(8)安全初始化
    /user/local/mysql/bin/mysql_secure_installation

3.編譯安裝

安裝包
yum install bison bison-devel zlib-devel libcurl-devel libarchive-devel boost-devel gcc gcc-c++ cmake ncurses-devel gnutls-devel libxml2-devel openssl-devel libevent-devel libaio-devel
做準備用戶和數據目錄
    useradd -r -s /sbin/nologin -d /data/mysql/ mysql
    mkdir /data/mysql
    chown mysql.mysql /data/mysql
    tar xvf mariadb-10.2.18.tar.gz
cmake 編譯安裝
cmake的重要特性之一是其獨立於源碼(out-of-source)的編譯功能,即編譯工作可以在另一個指定的目錄中而非源碼目錄中進行,這可以保證源碼目錄不受任何一次編譯的影響,因此在同一個源碼樹上可以進行多次不同的編譯,如針對於不同平臺編譯
編譯選項:https://dev.mysql.com/doc/refman/5.7/en/source-configuration-options.html

cd mariadb-10.2.18/
cmake . \
-DCMAKE_INSTALL_PREFIX=/app/mysql \
-DMYSQL_DATADIR=/data/mysql/ \
-DSYSCONFDIR=/etc/mysql \
-DMYSQL_USER=mysql \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITHOUT_MROONGA_STORAGE_ENGINE=1 \
-DWITH_DEBUG=0 \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_LIBWRAP=0 \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
make && make install
提示:如果出錯,執行rm -f CMakeCache.txt
準備環境變量
    echo 'PATH=/app/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
    . /etc/profile.d/mysql.sh
生成數據庫文件
    cd /app/mysql/
    scripts/mysql_install_db --datadir=/data/mysql/ --user=mysql
準備配置文件
    cp /app/mysql/support-files/my-huge.cnf /etc/my.cnf
準備啓動腳本
    cp /app/mysql/support-files/mysql.server /etc/init.d/mysqld
啓動服務
    chkconfig --add mysqld ;service mysqld start

三、管理數據庫和表

關係型數據庫的常見組件
數據庫:database
表:table
行:row
列:column
索引:index
視圖:view
用戶:user
權限:privilege
存儲過程:procedure
存儲函數:function
觸發器:trigger
事件調度器:event scheduler,任務計劃

數據庫操作
創建數據庫:
1.CREATE DATABASE|SCHEMA [IF NOT EXISTS] 'DB_NAME';
2.CHARACTER SET 'character set name’COLLATE 'collate name'
修改數據庫:
ALTER DATABASE DB_NAME character set utf8;
刪除數據庫
DROP DATABASE|SCHEMA [IF EXISTS] 'DB_NAME';
查看支持所有字符集:SHOW CHARACTER SET;
查看支持所有排序規則:SHOW COLLATION;
獲取命令使用幫助:
mysql> HELP KEYWORD;
查看數據庫列表:
mysql> SHOW DATABASES;


表:二維關係
設計表:遵循規範
定義:字段,索引
字段:字段名,字段數據類型,修飾符
約束,索引:應該創建在經常用作查詢條件的字段上

創建表:CREATE TABLE
(1) 直接創建
(2) 通過查詢現存表創建;新表會被直接插入查詢而來的數據
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options]
[partition_options] select_statement
(3) 通過複製現存的表的表結構創建,但不復制數據
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name { LIKE old_tbl_name | (LIKE old_tbl_name) }
注意:
Storage Engine是指表類型,也即在表創建時指明其使用的存儲引擎,同一庫中不同表可以使用不同的存儲引擎
同一個庫中表建議要使用同一種存儲引擎類型

字段信息
•col type1
•PRIMARY KEY(col1,...)
•INDEX(col1, ...)
•UNIQUE KEY(col1, ...)
表選項:
•ENGINE [=] engine_name
SHOW ENGINES;查看支持的engine類型
•ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
獲取幫助:mysql> HELP CREATE TABLE;

查看所有的引擎:SHOW ENGINES
查看錶:SHOW TABLES [FROM db_name]
查看錶結構:DESC [db_name.]tb_name
SHOW COLUMNS FROM [db_name.]tb_name
刪除表:DROP TABLE [IF EXISTS] tb_name
查看錶創建命令:SHOW CREATE TABLE tbl_name
查看錶狀態:SHOW TABLE STATUS LIKE 'tbl_name’
查看庫中所有表狀態:SHOW TABLE STATUS FROM db_name

四、數據類型:

數據長什麼樣
數據需要多少空間來存放
系統內置數據類型和用戶定義數據類型
MySql支持多種列類型:

  • 數值類型
  • 日期/時間類型
  • 字符串(字符)類型
  • https://dev.mysql.com/doc/refman/5.5/en/data-types.html
    選擇正確的數據類型對於獲得高性能至關重要,三大原則:
    • 更小的通常更好,儘量使用可正確存儲數據的最小數據類型
    • 簡單就好,簡單數據類型的操作通常需要更少的CPU週期
    • 儘量避免NULL,包含爲NULL的列,對MySQL更難優化

1、整型
tinyint(m) 1個字節 範圍(-128~127)
smallint(m) 2個字節 範圍(-32768~32767)
mediumint(m) 3個字節 範圍(-8388608~8388607)
int(m) 4個字節 範圍(-2147483648~2147483647)
bigint(m) 8個字節 範圍(+-9.22*10的18次方)
加了unsigned,則最大值翻倍,如:tinyint unsigned的取值範圍爲(0~255)
int(m)裏的m是表示SELECT查詢結果集中的顯示寬度,並不影響實際的取值範圍,規定了MySQL的一些交互工具(例如MySQL命令行客戶端)用來顯示字符的個數。對於存儲和計算來說,Int(1)和Int(20)是相同的
BOOL,BOOLEAN:布爾型,是TINYINT(1)的同義詞。zero值被視爲假,非zero值視爲真

2、浮點型(float和double),近似值
float(m,d) 單精度浮點型 8位精度(4字節) m總個數,d小數位
double(m,d) 雙精度浮點型16位精度(8字節) m總個數,d小數位
設一個字段定義爲float(6,3),如果插入一個數 123.45678,實際數據庫裏存的是123.457,但總個數還以實際爲準,即6位
3、定點數
在數據庫中存放的是精確值,存爲十進制
decimal(m,d) 參數m<65 是總個數,d<30且 d<m 是小數位
MySQL5.0和更高版本將數字打包保存到一個二進制字符串中(每4個字節存9個數字)。例如,decimal(18,9)小數點兩邊將各存儲9個數字,一共使用9個字節:小數點前的數字用4個字節,小數點後的數字用4個字節,小數點本身佔1個字節
浮點類型在存儲同樣範圍的值時,通常比decimal使用更少的空間。float使用4個字節存儲。double佔用8個字節
因爲需要額外的空間和計算開銷,所以應該儘量只在對小數進行精確計算時才使用decimal——例如存儲財務數據。但在數據量比較大的時候,可以考慮使用bigint代替decimal

4、字符串(char,varchar,_text)
char(n) 固定長度,最多255個字符
varchar(n) 可變長度,最多65535個字符
tinytext 可變長度,最多255個字符
text 可變長度,最多65535個字符
mediumtext 可變長度,最多2的24次方-1個字符
longtext 可變長度,最多2的32次方-1個字符
BINARY(M) 固定長度,可存二進制或字符,長度爲0-M字節
VARBINARY(M) 可變長度,可存二進制或字符,允許長度爲0-M字節
內建類型:ENUM枚舉, SET集合

5.二進制數據:BLOB
•BLOB和text存儲方式不同,TEXT以文本方式存儲,英文存儲區分大小寫,而Blob是以二進制方式存儲,不分大小寫
•BLOB存儲的數據只能整體讀出
•TEXT可以指定字符集,BLOB不用指定字符集

6.日期時間類型
•date 日期 '2008-12-2'
•time 時間 '12:25:36'
•datetime 日期時間 '2008-12-2 22:06:44'
•timestamp 自動存儲記錄修改時間
•YEAR(2), YEAR(4):年份
timestamp字段裏的時間數據會隨其他字段修改的時候自動刷新,這個數據類型的字段可以存放這條記錄最後被修改的時間

示例

CREATE TABLE students (id int UNSIGNED NOT NULL PRIMARY KEY,name VARCHAR(20)NOT NULL,age tinyint UNSIGNED);
DESC students;
CREATE TABLE students2 (id int UNSIGNED NOT NULL ,name VARCHAR(20) NOT NULL,age tinyint UNSIGNED,PRIMARY KEY(id,name));

表操作

DROP TABLE [IF EXISTS] 'tbl_name';
ALTER TABLE 'tbl_name'
字段:
    添加字段:add
        ADD col1 data_type [FIRST|AFTER col_name]
    刪除字段:drop
    修改字段:
        alter(默認值), change(字段名), modify(字段屬性)
索引:
    添加索引:add index
    刪除索引:drop index
表選項
修改:
查看錶上的索引:SHOW INDEXES FROM [db_name.]tbl_name;
查看幫助:Help ALTER TABLE

修改表示例

ALTER TABLE students RENAME s1;
ALTER TABLE s1 ADD phone varchar(11) AFTER name;
ALTER TABLE s1 MODIFY phone int;
ALTER TABLE s1 CHANGE COLUMN phone mobile char(11);
ALTER TABLE s1 DROP COLUMN mobile;
ALTER TABLE s1 character set utf8;
ALTER TABLE s1 change name name varchar(20) character set utf8;
Help ALTER TABLE 查看

多表查詢

交叉連接:笛卡爾乘積
內連接:
等值連接:讓表之間的字段以“等值”建立連接關係;
不等值連接
自然連接:去掉重複列的等值連接
自連接
外連接:
左外連接:
FROM tb1 LEFT JOIN tb2 ON tb1.col=tb2.col
右外連接
FROM tb1 RIGHT JOIN tb2 ON tb1.col=tb2.col
子查詢:在查詢語句嵌套着查詢語句,性能較差
基於某語句的查詢結果再次進行的查詢
用在WHERE子句中的子查詢
用於比較表達式中的子查詢;子查詢僅能返回單個值
SELECT Name,Age FROM students WHERE Age>(SELECT avg(Age) FROM students);
用於IN中的子查詢:子查詢應該單鍵查詢並返回一個或多個值從構成列表
SELECT Name,Age FROM students WHERE Age IN (SELECT Age FROM teachers);
用於EXISTS

用於FROM子句中的子查詢
使用格式:SELECT tb_alias.col1,... FROM (SELECT clause) AS tb_alias WHERE Clause;
示例:
SELECT s.aage,s.ClassID FROM (SELECT avg(Age) AS aage,ClassID FROM students WHERE ClassID IS NOT NULL GROUP BY ClassID) AS s WHERE s.aage>30;
聯合查詢:UNION
SELECT Name,Age FROM students UNION SELECT Name,Age FROM teachers;

五、函數,存儲過程和觸發器

1.函數:系統函數和自定義函數
系統函數:https://dev.mysql.com/doc/refman/5.7/en/func-op-summary-ref.html
自定義函數 (user-defined function UDF)
保存在mysql.proc表中
創建UDF
CREATE [AGGREGATE] FUNCTION function_name(parameter_name type,[parameter_name type,...])
RETURNS {STRING|INTEGER|REAL}
runtime_body
說明:
參數可以有多個,也可以沒有參數
必須有且只有一個返回值
創建函數
示例:無參UDF
CREATE FUNCTION simpleFun() RETURNS VARCHAR(20) RETURN "Hello World!”;
查看函數列表:
SHOW FUNCTION STATUS;
查看函數定義
SHOW CREATE FUNCTION function_name
刪除UDF:
DROP FUNCTION function_name
調用自定義函數語法:
SELECT function_name(parameter_value, ...)
示例:有參數UDF

DELIMITER //
CREATE FUNCTION deleteById(uid SMALLINT UNSIGNED) RETURNS VARCHAR(20)
BEGIN
DELETE FROM students WHERE stuid = uid;
RETURN (SELECT COUNT(stuid) FROM students);
END//
DELIMITER ;

2.存儲過程
存儲過程優勢
存儲過程把經常使用的SQL語句或業務邏輯封裝起來,預編譯保存在數據庫中,當需要時從數據庫中直接調用,省去了編譯的過程
提高了運行速度
同時降低網絡數據傳輸量
存儲過程與自定義函數的區別
存儲過程實現的過程要複雜一些,而函數的針對性較強
存儲過程可以有多個返回值,而自定義函數只有一個返回值
存儲過程一般可獨立執行,而函數往往是作爲其他SQL語句的一部分來使用
存儲過程:存儲過程保存在mysql.proc表中
創建存儲過程
CREATE PROCEDURE sp_name ([ proc_parameter [,proc_parameter ...]])
routime_body
proc_parameter : [IN|OUT|INOUT] parameter_name type
其中IN表示輸入參數,OUT表示輸出參數,INOUT表示既可以輸入也可以輸出;param_name表示參數名稱;type表示參數的類型
查看存儲過程列表
SHOW PROCEDURE STATUS
查看存儲過程定義
SHOW CREATE PROCEDURE sp_name
調用存儲過程
CALL sp_name ([ proc_parameter [proc_parameter ...]])
CALL sp_name
說明:當無參時,可以省略"()",當有參數時,不可省略"()”
存儲過程修改
ALTER語句修改存儲過程只能修改存儲過程的註釋等無關緊要的東西,不能修改存儲過程體,所以要修改存儲過程,方法就是刪除重建
刪除存儲過程
DROP PROCEDURE [IF EXISTS] sp_name
創建無參存儲過程

delimiter //
CREATE PROCEDURE showTime()
BEGIN
SELECT now();
END//
delimiter ;
CALL showTime

創建含參存儲過程:只有一個IN參數

delimiter //
CREATE PROCEDURE selectById(IN uid SMALLINT UNSIGNED)
BEGIN
SELECT * FROM students WHERE stuid = uid;
END//
delimiter ;
call selectById(2);

示例

delimiter //
CREATE PROCEDURE dorepeat(n INT)
BEGIN
SET @i = 0;
SET @sum = 0;
REPEAT SET @sum = @sum+@i; SET @i = @i + 1;
UNTIL @i > n END REPEAT;
END//
delimiter ;
CALL dorepeat(100);
SELECT @sum;

創建含參存儲過程:包含IN參數和OUT參數

delimiter //
CREATE PROCEDURE deleteById(IN uid SMALLINT UNSIGNED, OUT num SMALLINT UNSIGNED)
BEGIN
DELETE FROM students WHERE stuid >= uid;
SELECT row_count() into num;
END//
delimiter ;
call deleteById(2,@Line);
SELECT @Line;

說明:創建存儲過程deleteById,包含一個IN參數和一個OUT參數.調用時,傳入刪除的ID和保存被修改的行數值的用戶變量@Line,select @Line;輸出被影響行數

3.流程控制
存儲過程和函數中可以使用流程控制來控制語句的執行
流程控制:
IF:用來進行條件判斷。根據是否滿足條件,執行不同語句
CASE:用來進行條件判斷,可實現比IF語句更復雜的條件判斷
LOOP:重複執行特定的語句,實現一個簡單的循環
LEAVE:用於跳出循環控制
ITERATE:跳出本次循環,然後直接進入下一次循環
REPEAT:有條件控制的循環語句。當滿足特定條件時,就會跳出循環語句
WHILE:有條件控制的循環語句
觸發器
觸發器的執行不是由程序調用,也不是由手工啓動,而是由事件來觸發、激活從而實現執行
創建觸發器

CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name
trigger_time trigger_event
ON tbl_name FOR EACH ROW
trigger_body

說明:
trigger_name:觸發器的名稱
trigger_time:{ BEFORE | AFTER },表示在事件之前或之後觸發
trigger_event::{ INSERT |UPDATE | DELETE },觸發的具體事件
tbl_name:該觸發器作用在表名

觸發器示例

CREATE TABLE student_info (
stu_id INT(11) NOT NULL AUTO_INCREMENT,
stu_name VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (stu_id)
);
CREATE TABLE student_count (
student_count INT(11) DEFAULT 0
);
INSERT INTO student_count VALUES(0);

示例:創建觸發器,在向學生表INSERT數據時,學生數增加,DELETE學生時,學生數減少

CREATE TRIGGER trigger_student_count_insert
AFTER INSERT
ON student_info FOR EACH ROW
UPDATE student_count SET student_count=student_count+1;
CREATE TRIGGER trigger_student_count_delete
AFTER DELETE
ON student_info FOR EACH ROW
UPDATE student_count SET student_count=student_count-1;

查看觸發器
SHOW TRIGGERS
查詢系統表information_schema.triggers的方式指定查詢條件,查看指定的觸發器信息。
mysql> USE information_schema;
Database changed
mysql> SELECT * FROM triggers WHERE trigger_name='trigger_student_count_insert';
刪除觸發器
DROP TRIGGER trigger_name;

六、mysql用戶和權限管理

創建用戶:CREATE USER
CREATE USER 'USERNAME'@'HOST' [IDENTIFIED BY 'password'];
默認權限:USAGE
用戶重命名:RENAME USER
RENAME USER old_user_name TO new_user_name;
刪除用戶:
DROP USER 'USERNAME'@'HOST‘
示例:刪除默認的空用戶
DROP USER ''@'localhost';
修改密碼:
mysql>SET PASSWORD FOR 'user'@'host' = PASSWORD(‘password');
mysql>UPDATE mysql.user SET password=PASSWORD('password') WHERE clause;
此方法需要執行下面指令才能生效:
mysql> FLUSH PRIVILEGES;
mysqladmin -u root -poldpass password ‘newpass’
忘記管理員密碼的解決辦法:
啓動mysqld進程時,爲其使用如下選項:
--skip-grant-tables --skip-networking
使用UPDATE命令修改管理員密碼
關閉mysqld進程,移除上述兩個選項,重啓mysqld

七、存儲引擎

MyISAM引擎特點
不支持事務
表級鎖定
讀寫相互阻塞,寫入不能讀,讀時不能寫
只緩存索引
不支持外鍵約束
不支持聚簇索引
讀取數據較快,佔用資源較少
不支持MVCC(多版本併發控制機制)高併發
崩潰恢復性較差
MySQL5.5.5前默認的數據庫引擎
MyISAM存儲引擎適用場景
只讀(或者寫較少)、表較小(可以接受長時間進行修復操作)
MyISAM引擎文件
tbl_name.frm 表格式定義
tbl_name.MYD 數據文件
tbl_name.MYI 索引文件

InnoDB數據庫文件

所有InnoDB表的數據和索引放置於同一個表空間中
表空間文件:datadir定義的目錄下
數據文件:ibddata1, ibddata2, ...
每個表單獨使用一個表空間存儲表的數據和索引
啓用:innodb_file_per_table=ON
參看:https://mariadb.com/kb/en/library/xtradbinnodb-server-system-variables/#innodb_file_per_table
ON (>= MariaDB 5.5)
兩類文件放在數據庫獨立目錄中
數據文件(存儲數據和索引):tb_name.ibd
表格式定義:tb_name.frm

其它存儲引擎
1.Performance_Schema:Performance_Schema數據庫使用
2.Memory :將所有數據存儲在RAM中,以便在需要快速查找參考和其他類似數據的環境中進行快速訪問。適用存放臨時數據。引擎以前被稱爲HEAP引擎
3.MRG_MyISAM:使MySQL DBA或開發人員能夠對一系列相同的MyISAM表進行邏輯分組,並將它們作爲一個對象引用。適用於VLDB(Very Large Data Base)環境,如數據倉庫
4.Archive :爲存儲和檢索大量很少參考的存檔或安全審覈信息,只支持SELECT和INSERT操作;支持行級鎖和專用緩存區
5.Federated聯合:用於訪問其它遠程MySQL服務器一個代理,它通過創建一個到遠程MySQL服務器的客戶端連接,並將查詢傳輸到遠程服務器執行,而後完成數據存取,提供鏈接單獨MySQL服務器的能力,以便從多個物理服務器創建一個邏輯數據庫。非常適合分佈式或數據集市環境

MySQL中的系統數據庫
mysql數據庫
是mysql的核心數據庫,類似於Sql Server中的master庫,主要負責存儲數據庫的用戶、權限設置、關鍵字等mysql自己需要使用的控制和管理信息
performance_schema數據庫
MySQL 5.5開始新增的數據庫,主要用於收集數據庫服務器性能參數,庫裏表的存儲引擎均爲PERFORMANCE_SCHEMA,用戶不能創建存儲引擎爲PERFORMANCE_SCHEMA的表
information_schema數據庫
MySQL 5.0之後產生的,一個虛擬數據庫,物理上並不存在information_schema數據庫類似與“數據字典”,提供了訪問數據庫元數據的方式,即數據的數據。比如數據庫名或表名,列類型,訪問權限(更加細化的訪問方式)

mysqld選項,服務器系統變量和服務器狀態變量
https://dev.mysql.com/doc/refman/5.7/en/mysqld-option-tables.html
https://mariadb.com/kb/en/library/full-list-of-mariadb-options-system-and-status-variables/
注意:其中有些參數支持運行時修改,會立即生效;有些參數不支持,且只能通過修改配置文件,並重啓服務器程序生效;有些參數作用域是全局的,且不可改變;有些可以爲每個用戶提供單獨(會話)的設置

服務器配置
獲取mysqld的可用選項列表:
mysqld --help --verbose
mysqld --print-defaults 獲取默認設置
設置服務器選項方法:
在命令行中設置
shell> ./mysqld_safe --skip-name-resolve=1
在配置文件my.cnf中設置
skip_name_resolve=1

八、mysql架構

查詢緩存
查詢緩存( Query Cache )原理
緩存SELECT操作或預處理查詢的結果集和SQL語句,當有新的SELECT語句或預處理查詢語句請求,先去查詢緩存,判斷是否存在可用的記錄集,判斷標準:與緩存的SQL語句,是否完全一樣,區分大小寫
優缺點
不需要對SQL語句做任何解析和執行,當然語法解析必須通過在先,直接從Query Cache中獲得查詢結果,提高查詢性能
查詢緩存的判斷規則,不夠智能,也即提高了查詢緩存的使用門檻,降低其效率;
查詢緩存的使用,會增加檢查和清理Query Cache中記錄集的開銷

哪些查詢可能不會被緩存
查詢語句中加了SQL_NO_CACHE參數
查詢語句中含有獲得值的函數,包含自定義函數,如:NOW()
CURDATE()、GET_LOCK()、RAND()、CONVERT_TZ()等
對系統數據庫的查詢:mysql、information_schema 查詢語句中使用SESSION級別變量或存儲過程中的局部變量
查詢語句中使用了LOCK IN SHARE MODE、FOR UPDATE的語句,查詢語句中類似SELECT …INTO 導出數據的語句
對臨時表的查詢操作;存在警告信息的查詢語句;不涉及任何表或視圖的查詢語句;某用戶只有列級別權限的查詢語句
事務隔離級別爲Serializable時,所有查詢語句都不能緩存

查詢緩存相關的服務器變量
query_cache_min_res_unit:查詢緩存中內存塊的最小分配單位,默認4k,較小值會減少浪費,但會導致更頻繁的內存分配操作,較大值會帶來浪費,會導致碎片過多,內存不足
query_cache_limit:單個查詢結果能緩存的最大值,默認爲1M,對於查詢結果過大而無法緩存的語句,建議使用SQL_NO_CACHE
query_cache_size:查詢緩存總共可用的內存空間;單位字節,必須是1024的整數倍,最小值40KB,低於此值有警報
query_cache_wlock_invalidate:如果某表被其它的會話鎖定,是否仍然可以從查詢緩存中返回結果,默認值爲OFF,表示可以在表被其它會話鎖定的場景中繼續從緩存返回數據;ON則表示不允許
query_cache_type:是否開啓緩存功能,取值爲ON, OFF, DEMAND

SELECT語句的緩存控制
SQL_CACHE:顯式指定存儲查詢結果於緩存之中
SQL_NO_CACHE:顯式查詢結果不予緩存
query_cache_type參數變量
query_cache_type的值爲OFF或0時,查詢緩存功能關閉
query_cache_type的值爲ON或1時,查詢緩存功能打開 SELECT的結果符合緩存條件即會緩存,否則,不予緩存,顯式指定SQL_NO_CACHE,不予緩存,此爲默認值
query_cache_type的值爲DEMAND或2時,查詢緩存功能按需進行,顯式指定SQL_CACHE的SELECT語句纔會緩存;其它均不予緩存
參看:https://mariadb.com/kb/en/library/server-system-variables/#query_cache_type
https://dev.mysql.com/doc/refman/5.7/en/query-cache-configuration.html

命中率和內存使用率估算
查詢緩存中內存塊的最小分配單位 query_cache_min_res_unit :(query_cache_size - Qcache_free_memory) / Qcache_queries_in_cache
查詢緩存命中率 :Qcache_hits / ( Qcache_hits + Qcache_inserts ) 100%
查詢緩存內存使用率:(query_cache_size – qcache_free_memory) / query_cache_size
100%

InnoDB存儲引擎
InnoDB存儲引擎的緩衝池:
通常InnoDB存儲引擎緩衝池的命中不應該小於99%
查看相關狀態變量:
show global status like 'innodb%read%'\G
Innodb_buffer_pool_reads: 表示從物理磁盤讀取頁的次數
Innodb_buffer_pool_read_ahead: 預讀的次數
Innodb_buffer_pool_read_ahead_evicted: 預讀頁,但是沒有讀取就從緩衝池中被替換的頁數量,一般用來判斷預讀的效率
Innodb_buffer_pool_read_requests: 從緩衝池中讀取頁次數
Innodb_data_read: 總共讀入的字節數
Innodb_data_reads: 發起讀取請求的次數,每次讀取可能需要讀取

索引
索引:是特殊數據結構,定義在查找時作爲查找條件的字段,在MySQL又稱爲鍵key,索引通過存儲引擎實現
優點:
索引可以降低服務需要掃描的數據量,減少了IO次數
索引可以幫助服務器避免排序和使用臨時表
索引可以幫助將隨機I/O轉爲順序I/O
缺點:
佔用額外空間,影響插入速度

索引類型:
B+ TREE、HASH、R TREE
聚簇(集)索引、非聚簇索引:數據和索引是否存儲在一起
主鍵索引、二級(輔助)索引
稠密索引、稀疏索引:是否索引了每一個數據項
簡單索引、組合索引
左前綴索引:取前面的字符做索引
覆蓋索引:從索引中即可取出要查詢的數據,性能高

B+TREE索引
B+Tree索引:順序存儲,每一個葉子節點到根結點的距離是相同的;左前綴索引,適合查詢範圍類的數據
可以使用B+Tree索引的查詢類型:
全值匹配:精確所有索引列,如:姓wang,名xiaochun,年齡30
匹配最左前綴:即只使用索引的第一列,如:姓wang
匹配列前綴:只匹配一列值開頭部分,如:姓以w開頭的
匹配範圍值:如:姓ma和姓wang之間
精確匹配某一列並範圍匹配另一列:如:姓wang,名以x開頭的
只訪問索引的查詢

B+Tree索引的限制:
如不從最左列開始,則無法使用索引,如:查找名xiaochun,或姓爲g結尾
不能跳過索引中的列:如:查找姓wang,年齡30的,只能使用索引第一列
特別提示:
索引列的順序和查詢語句的寫法應相匹配,才能更好的利用索引
爲優化性能,可能需要針對相同的列但順序不同創建不同的索引來滿足不同類型的查詢需求

索引優化策略:
獨立地使用列:儘量避免其參與運算,獨立的列指索引列不能是表達式的一部分,也不能是函數的參數,在where條件中,始終將索引列單獨放在比較符號的一側
左前綴索引:構建指定索引字段的左側的字符數,要通過索引選擇性來評估
索引選擇性:不重複的索引值和數據表的記錄總數的比值
多列索引:AND操作時更適合使用多列索引,而非爲每個列創建單獨的索引
選擇合適的索引列順序:無排序和分組時,將選擇性最高放左側

索引優化建議
只要列中含有NULL值,就最好不要在此例設置索引,複合索引如果有NULL值,此列在使用時也不會使用索引
儘量使用短索引,如果可以,應該制定一個前綴長度
對於經常在where子句使用的列,最好設置索引
對於有多個列where或者order by子句,應該建立複合索引
對於like語句,以%或者‘-’開頭的不會使用索引,以%結尾會使用索引
儘量不要在列上進行運算(函數操作和表達式操作)
儘量不要使用not in和<>操作

SQL語句性能優化
查詢時,能不要就不用,儘量寫全字段名
大部分情況連接效率遠大於子查詢
多表連接時,儘量小表驅動大表,即小表 join 大表
在有大量記錄的表分頁時使用limit
對於經常使用的查詢,可以開啓緩存
多使用explain和profile分析查詢語句
查看慢查詢日誌,找出執行時間長的sql語句優化

管理索引
創建索引:

CREATE INDEX [UNIQUE] index_name ON tbl_name (index_col_name[(length)],...);
ALTER TABLE tbl_name ADD INDEX index_name(index_col_name);
help CREATE INDEX;

刪除索引:

DROP INDEX index_name ON tbl_name;
ALTER TABLE tbl_name DROP INDEX index_name(index_col_name);

查看索引:

SHOW INDEXES FROM [db_name.]tbl_name;

優化表空間:

OPTIMIZE TABLE tb_name;

查看索引的使用
SET GLOBAL userstat=1;
SHOW INDEX_STATISTICS;

併發控制

鎖策略:在鎖粒度及數據安全性尋求的平衡機制
顯式使用鎖
    LOCK TABLES 加鎖
        tbl_name [[AS] alias] lock_type
        [, tbl_name [[AS] alias] lock_type] ...
        lock_type: READ , WRITE
        UNLOCK TABLES 解鎖
FLUSH TABLES [tb_name[,...]] [WITH READ LOCK]
    關閉正在打開的表(清除查詢緩存),通常在備份前加全局讀鎖
SELECT clause [FOR UPDATE | LOCK IN SHARE MODE]
    查詢時加寫或讀鎖

事務

事務Transactions:一組原子性的SQL語句,或一個獨立工作單元
事務日誌:記錄事務信息,實現undo,redo等故障恢復功能
ACID特性:
    A:atomicity原子性;整個事務中的所有操作要麼全部成功執行,要麼全部失敗後回滾
    C:consistency一致性;數據庫總是從一個一致性狀態轉換爲另一個一致性狀態
    I:Isolation隔離性;一個事務所做出的操作在提交之前,是不能爲其它事務所見;隔離有多種隔離級別,實現併發
    D:durability持久性;一旦事務提交,其所做的修改會永久保存於數據庫中

啓動事務:
BEGIN
BEGIN WORK
START TRANSACTION
結束事務:
COMMIT:提交
ROLLBACK: 回滾
注意:只有事務型存儲引擎中的DML語句方能支持此類操作
自動提交:set autocommit={1|0} 默認爲1,爲0時設爲非自動提交
建議:顯式請求和提交事務,而不要使用“自動提交”功能
事務支持保存點:savepoint
SAVEPOINT identifier
ROLLBACK [WORK] TO [SAVEPOINT] identifier
RELEASE SAVEPOINT identifier

事務隔離級別
事務隔離級別:從上至下更加嚴格
READ UNCOMMITTED 可讀取到未提交數據,產生髒讀
READ COMMITTED 可讀取到提交數據,但未提交數據不可讀,產生不可重複讀,即可讀取到多個提交數據,導致每次讀取數據不一致
REPEATABLE READ 可重複讀,多次讀取數據都一致,產生幻讀,即讀取過程中,即使有其它提交的事務修改數據,仍只能讀取到未修改前的舊數據。此爲MySQL默認設置
SERIALIZABILE 可串行化,未提交的讀事務阻塞修改事務,或者未提交的修改事務阻塞讀事務。導致併發性能差
MVCC: 多版本併發控制,和事務級別相關

併發控制
死鎖:
兩個或多個事務在同一資源相互佔用,並請求鎖定對方佔用的資源的狀態
事務日誌:
事務日誌的寫入類型爲“追加”,因此其操作爲“順序IO”;通常也被稱爲:預寫式日誌 write ahead logging
事務日誌文件: ib_logfile0, ib_logfile1

  • 還有日誌管理 ,備份還原,mysql集羣在下週總結
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章