Mysql知識總結(一)

一、基本介紹:

       MySQL是一款開源的關係數據庫管理系統,最早有瑞典的MySQL AB公司開發,2008年被SUN公司收購,2009年,SUN公司被Oracle公司收購。MySQL性能高、成本低、安全穩定,被廣泛應用在中小型網站中,隨着MySQL的性能不斷提高,像維基百科、Google、Facebook等大公司也正在使用MySQL(維基百科現在以遷移到MariaDB)。

       MySQL使用C和C++編寫,併爲多種語言提供了API,支持多線程,充分利用CPU資源,支持多用戶,提供TCP/IP/、ODBC和JDBC等等多種數據庫連接途徑,且提供了用於管理、檢查、優化數據庫操作的管理工具,可以處理擁有上千萬條記錄的大型數據庫。

二、MySQL體系結構:

wKioL1ND_YWCeulJAAJ8fPu-W-g198.jpg

1、Connectors指的是不同語言中與SQL的交互

2、Management Serveices & Utilities: 系統管理和控制工具

3、Connection Pool: 連接池

   管理緩衝用戶連接,線程處理等需要緩存的需求。

4、SQL Interface: SQL接口

   接受用戶的SQL命令,並且返回用戶需要查詢的結果。比如select from就是調用SQL Interface。

5、Parser: 解析器。

   SQL命令傳遞到解析器的時候會被解析器驗證和解析。解析器是由Lex和YACC實現的,是一個很長的腳本。

主要功能:

   a . 將SQL語句分解成數據結構,並將這個結構傳遞到後續步驟,以後SQL語句的傳遞和處理就是基於這個結構的 。

   b.  如果在分解構成中遇到錯誤,那麼就說明這個sql語句是不合理的。

6、Optimizer: 查詢優化器

   SQL語句在查詢之前會使用查詢優化器對查詢進行優化。他使用的是“選取-投影-聯接”策略進行查詢。

   用一個例子就可以理解: select uid,name from user where gender = f;

       這個select 查詢先根據where 語句進行選取,而不是先將表全部查詢出來以後再進行gender過濾。

       這個select查詢先根據uid和name進行屬性投影,而不是將屬性全部取出以後再進行過濾。

       將這兩個查詢條件聯接起來生成最終查詢結果。

7、Cache和Buffer: 查詢緩存

   如果查詢緩存有命中的查詢結果,查詢語句就可以直接去查詢緩存中取數據。

   這個緩存機制是由一系列小緩存組成的。比如表緩存,記錄緩存,key緩存,權限緩存等。

8、Engine :存儲引擎

   存儲引擎是MySql中具體的與文件打交道的子系統。也是Mysql最具有特色的一個地方。

   Mysql的存儲引擎是插件式的。它根據MySql AB公司提供的文件訪問層的一個抽象接口來定製一種文件訪問機制(這種訪問機制就叫存儲引擎)。

   現在有很多種存儲引擎,各個存儲引擎的優勢各不一樣,最常用的MyISAM,InnoDB,BDB。

   默認下MySql是使用MyISAM引擎,它查詢速度快,有較好的索引優化和數據壓縮技術。但是它不支持事務。

   InnoDB支持事務,並且提供行級的鎖定,應用也相當廣泛。

   Mysql也支持自己定製存儲引擎,甚至一個庫中不同的表使用不同的存儲引擎,這些都是允許的。

   後面我會詳細介紹這些引擎各自的特性。

從上圖我們換個角度(微觀)來解析一下它:

wKioL1NEDvHxo2cbAAH4amhifFk933.jpg

1、連接管理器:

   當客戶發起請求後由連接管理器負責接收這個請求;

2、線程管理器:

   MySQL是以單進程多線程的方式運作的,於是它將會爲每一個用戶生成一個線程

3、用戶模塊

   它的作用是進行身份進行認證,管理用戶,一旦訪問完成後,退出了,線程就會被線程管理器回收到連接池中;其實用戶最終要用戶模塊打交道,只有第一次剛剛發起連接時才需要認證;後續的SQL語句都與用戶模塊打交道,而不再是連接管理器了;

4、命令派發器:

   一旦用戶認證通過連接進來後它會將那些SQL語句派發到:

       "查詢緩存",如果查詢緩存一旦命中,那麼結果也就直接返回客戶端;

       "日誌記錄",一旦我們開啓了查詢日誌,待我們查詢完成後需要將執行操作記錄日誌;

5、分析器:

   如果上面的由命令派發到查詢緩存沒有命中,那麼命令派發器會將SQL語句轉交給分析器,由分析器進行SQL語句分析;這些語句有可能包含:DML、DDL,這些不同的語句就需要有不同的機制來處理;

   優化器:分析器分析出這是一條查詢語句那麼由優化器來負責處理;SELECT

   表修改模塊:如果是更新或修改表中數據的操作,則由表修改模塊負責;UPDATE/INSET/DELETE/REPLACE.....

    表維護模塊:如果表需要修復則由表維護模塊負責;

    複製模塊:如果分析出是表或數據複製操作,則有複製模塊操作;Replication(要啓用該模塊功能才起作用)

    狀態報告模塊:優化器之所以能夠完成優化,它是根據Mysql服務器不斷收集狀態信息得來的,所以由此模塊負責狀態報告;

6.訪問控制模塊:

    上面的用戶認證授權通過後並不意味着就有權限訪問任意數據,這裏通過訪問控制模塊再次對權限進行檢查;

7.表管理器

     如果訪問控制檢查通過,真正執行操作則有表管理器來負責,無論是增刪查改等這樣的語句;

8.存儲引擎

     表管理器執行操作則會通過它的內部接口,這個操作要依賴於存儲引擎; 存儲引擎這個抽象接口將用戶請求轉交給各個對應使用的存儲引擎,完成操作最終將其結果返回客戶端。


OK,瞭解了MySQL的基本體系架構後我們嘗試安裝一下吧,我們知道安裝mysql的方式有三種:二進制源碼包安裝、RPM包安裝以及編譯安裝前面的那些試驗當中也演示到了二進制源碼和rpm包安裝,這裏我將採用源碼包的方式安裝:

說明:

    MySQL5.5版本開始,通過./configure進行編譯配置方式已經被取消,取而代之的是cmake工具。

因此,我們首先要在系統中源碼編譯安裝cmake工具,我這裏使用的cmake版本爲cmake-2.8.10.2,mysql爲5.5.36

  注意:開發環境

1.獲取cmake,安裝之

[root@mysql ~]# wget http://down1.chinaunix.net/distfiles/cmake-2.8.10.2.tar.gz
[root@mysql ~]# tar -xf cmake-2.8.10.2.tar.gz -C /usr/src/
[root@mysql ~]# cd /usr/src/cmake-2.8.10.2/
[root@mysql cmake-2.8.10.2]# ./configure

2. 安裝mysql前的系統設置

建立mysql安裝目錄及數據存放目錄

安裝路徑:

[root@mysql ~]# mkdir /usr/local/mysql

數據庫路徑:

[root@mysql ~]# mkdir /data/mysql
#建議此目錄掛載至LVM上面,這樣對於後期的擴容有很大的幫助!

創建用戶和用戶組

[root@mysql ~]#groupadd mysql
[root@mysql ~]#useradd -g mysql mysql

賦予數據存放目錄權限

[root@mysql ~]# chown mysql:mysql -R /data/mysql


3.編譯安裝 MySQL 5.5

通過http://www.mysql.com/downloads/mysql官方網址或國內的sohu鏡像下載軟件包.

[root@mysql ~]# wget http://mirrors.sohu.com/mysql/MySQL-5.5/mysql-5.5.36.tar.gz
[root@mysql ~]# cd /usr/src/
[root@mysql src]# ln -sv mysql-5.5.36 mysql
`mysql' -> `mysql-5.5.36'
[root@mysql ~]# cd mysql
[root@mysql mysql]#  cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/mydata/data \
-DSYSCONFDIR=/etc \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1  \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_READLINE=1  \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_LIBWRAP=0 \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8  \
-DDEFAULT_COLLATION=utf8_general_ci
[root@mysql ~]# make && make install

makemake install的時候可以看到進度百分比,感覺這一點要比configure方式要好。

參數說明:

指定安裝文件的安裝路徑時常用的選項:

-DCMAKE_INSTALL_PREFIX=/usr/local/mysql
-DMYSQL_DATADIR=/data/mysql
-DSYSCONFDIR=/etc

默認編譯的存儲引擎包括:csv、myisam、myisammrg和heap。若要安裝其它存儲引擎,可以使用類似如下編譯選項:

-DWITH_INNOBASE_STORAGE_ENGINE=1
-DWITH_ARCHIVE_STORAGE_ENGINE=1
-DWITH_BLACKHOLE_STORAGE_ENGINE=1
-DWITH_FEDERATED_STORAGE_ENGINE=1

若要明確指定不編譯某存儲引擎,可以使用類似如下的選項:

-DWITHOUT_<ENGINE>_STORAGE_ENGINE=1

比如:

-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1
-DWITHOUT_FEDERATED_STORAGE_ENGINE=1
-DWITHOUT_PARTITION_STORAGE_ENGINE=1

如若要編譯進其它功能,如SSL等,則可使用類似如下選項來實現編譯時使用某庫或不使用某庫:

-DWITH_READLINE=1
-DWITH_SSL=system
-DWITH_ZLIB=system
-DWITH_LIBWRAP=0

其它常用的選項:

-DMYSQL_TCP_PORT=3306
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock
-DENABLED_LOCAL_INFILE=1
-DEXTRA_CHARSETS=all
-DDEFAULT_CHARSET=utf8
-DDEFAULT_COLLATION=utf8_general_ci
-DWITH_DEBUG=0
-DENABLE_PROFILING=1

如果想清理此前的編譯所生成的文件,則需要使用如下命令:

make clean
rm CMakeCache.txt

makemake install的時候可以看到進度百分比,感覺這一點要比configure方式要好。


首先說一下mysql主配置文件的特點(按以下序號次序來尋找)

1  /etc/my.cnf  集中式配置文件,爲多個命令提供配置
2  /etc/mysql/my.cnf
3  $MYSQL_HOME/my.cnf
4  /path/to/file when defaults-extra-file=/path/to/file is specified
5   ~/.my.cnf

   如果發現多個配置文件, MySQL會將所有的配置文件組合起來,將他們的合合集作爲配置文件來使用 。如果配置出現衝突,則以讀取最後一個配置文件中的配置爲準。          

   如果啓動服務的時候想不使用默認的數據存放目錄,需要在初始化的時候使用datadir指令來定義。

讓mysql服務啓動的時候讀取額外的配置文件:

mysqld_safe --defaults-extra-file=/etc/mysql/my_instance.cnf。


將源碼安裝的apache的二進制文件的路徑加入環境變量中,並通過source對文件重讀:

[root@mysql mysql]# vim /etc/profile.d/mysqld.sh
export PATH=$PATH:/usr/local/mysql/bin:PATH
[root@mysql mysql]# source /etc/profile.d/mysqld.sh

將源碼安裝的mysql的頭文件導入到系統找得到的位置:

[root@mysql mysql]# mkdir  /usr/local/include/mysql
[root@mysql mysql]# ln -sv /usr/local/mysql/include /usr/local/include/mysql
/usr/local/include/mysql/include' -> `/usr/local/mysql/include'
[root@mysql mysql]#

將源碼安裝的apache的庫文件導出給系統找得到的位置

[root@mysql mysql]# vim /etc/ld.so.conf.d/mysqld.conf
/usr/local/mysql/lib  #加入此行

將源碼安裝的apacheman手冊的導入系統找得到的位置

[root@mysql mysql]# vim /etc/man.config
MANPATH /usr/local/mysql/man

創建my.cnf配置文件

[root@mysql mysql]# cp support-files/my-large.cnf /etc/my.cnf
cp: overwrite `/etc/my.cnf'? y
[root@mysql mydata]# vim /etc/my.cnf
datadir = /data/mydata  #加入此行

執行初始化腳本對數據庫進行初始化:

[root@mysql mysql]# scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql/ --datadir=/data/mydata/

創建管理MySQL數據庫的shell腳本

[root@mysql mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@mysql mysql]# chmod +x /etc/rc.d/init.d/mysqld

添加爲開機自啓動項

[root@mysql mysql]# chkconfig --add mysqld
[root@mysql mysql]# chkconfig mysqld on

啓動mysql

[root@mysql mysql]# service mysqld start
Starting MySQL..              [  OK  ]
[root@mysql mysql]# netstat -an | grep :3306
tcp        0   0    0.0.0.0:3306    0.0.0.0:*        LISTEN
[root@mysql mysql]#

ok!至此我們源碼包編譯安裝操作已經完成,接下來就是對他進行簡單配置即可:


在mysql安裝完之後,要做的第一件事就是爲管理員賬戶設定密碼,並刪除兩個匿名用戶;一般mysql安裝完成之後會生成三個管理員用戶賬號,和兩個匿名用戶賬號。

四個個管理員用戶賬號:

[email protected]
root@localhost
root@hostname
root@::1

兩個匿名用戶賬號:

''@localhost
''@hostname

刪除所有匿名用戶

mysql> DROP USER ''@'localhost';
mysql> DROP USER ''@'www.magedu.com';

用戶帳號由兩部分組成:username@hostname
 host還可以使用通配符:
  %: 任意長度的任意字符
  _: 匹配任意單個字符
給所有的root用戶設定密碼:
   第一種方式:    

mysql> SET PASSWORD FOR username@hostname = PASSWORD('your_passwrod');

   第二種方式:

mysql> UPDATE user SET password = PASSWORD('your_password') WHERE user = 'root';
mysql> FLUSH PRIVILEGES;

   第三種方式:

# mysqladmin -uUserName -hHost password 'new_password' -p
# mysqladmin -uUserName -hHost -p flush-privileges

連入MySQL服務器
    mysql client <--mysql protocol--> mysqld
mysqld接收連接請求:
  本地通信:客戶端與服務器端位於同一主機,而且還要基於127.0.0.1(localhost)地址或lo接口進行通信;
  遠程通信:客戶端與服務器位於不同的主機,或在同一主機便使用非迴環地址通信
客戶端工具:mysql, mysqladmin, mysqldump, mysqlcheck

幫助信息:
-?
-I
--help
**********************************************************
(單字符後面不帶空格)
--user,-u 指定用戶訪問mysqld
--host,-h 指定服務器的名字
--password,-p
--protocol 指定連接協議(tcp/socket/pipe/memory)
使用--protocol socket時,本地客戶端是通過/tmp/mysql.sock(sock文件位置可能不同)連接本地mysqld服務
--port 遠程服務器的連接端口
--socket
-D db_name 直接使用某個數據庫作爲默認數據庫
--datebase=...
--compress 數據在服務器端和客戶端之間壓縮傳輸
--default-character-set=charset_name 指定字符集
-V  顯示版本號
-v命令執行時顯示詳細信息
--ssl-ca=/path/to/ssl_ca_file證書存放位置 (爲了驗證對方的證書)
--ssl-capath=/path/to/ca_dir證書目錄
--ssl-cert=/path/to/cert_file//自己的證書
--ssl-cipher=cipher_list   加密方式
--ssl-key=/path/to/key_file自己的私鑰
--ssl-verify-server-cert    驗證服務器證書


mysql -e 不登陸mysql直接執行命令

[root@mysql ~]# mysql -e 'SHOW DATABASES;'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
[root@mysql ~]#


mysqladmin常用選項:

create 創建數據庫
drop   刪除數據庫
debug  用於輸出調試信息
status 顯示全局變量和他的值
--sleepn  每個n秒顯示一次
--count n  一共顯示n次
例如:#mysqladmin --sleep 3 --count 3 status
extended-status 顯示所有系統變量和值/運行狀態屬性信息
flush-hosts  清空hosts內部信息
flush-logs   做二進制日誌滾動
flush-privileges 刷新
flush-status  重新開始計數
flush-tables  關閉表
flush-threads 重置線程緩存池
kill結束某個客戶端線程
processlist 列舉所有的進程和線程
password 爲某用戶設置密碼
ping查看是否處於運行狀態
reload   flush-privilege
refresh    flush-hosts&flush-logs
shutdown關閉指定mysql服務器
start-slave 啓動從服務器
stop-slave
variables 顯示全局變量

mysql的快捷鍵:

Ctrl + w: 刪除光標之前的單詞
Ctrl + u: 刪除光標之前至命令行首的所有內容
Ctrl + y: 粘貼使用Ctrl+w或Ctrl+u刪除的內容
Ctrl + a: 移動光標至行首
Ctrl + e: 移動光標至行尾

數據類型的功用:

1、存儲的值類型;
2、佔據的礁存儲空間;
3、定長,變長;
4、如何被索引及排序;
5、是否能夠被索引;

SQL語言組成部分:

DDL:數據庫定義語言
DML:
完整性定義語言:DDL的一部分功能
    主鍵、外鍵、惟一鍵、條件、非空、事務
視圖定義:虛表,存儲下來的SELECT語句
事務控制
嵌入式SQL和動態SQL
DCL:授權


數據字典:系統編目(system catalog, )

保存數據庫服務器上的元數據(非數據本身沒有關係,但是可以通過其管理數據)

初始化mysql後生成的"mysql"

元數據:
關係的名字
每個關係的各字段的名字
各字段的數據類型和長度
約束
每個關係上的視圖的名字及視圖的定義
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
授權用戶的名字
用戶授權和賬戶信息
統計類的數據
    每個關係字段的個數
    每個關係中行數
    每個關係的存儲方法
保存原數據的數據庫:
    information_schema
    performance_schema (類似於Linux文件系統中的proc)


三、mysql數據類型:

1.常用數據類型:

數值型:

       整型(5種)

    TINYINT

    SMALLINT

    MEDIUMINT

    INT   (大於前面的)

    BIGINT

    十進制定點數

    DESCIMAL

    單精度浮點數:

    FLOAT

    雙精度浮點數

    DOUBLE

    位:按位存儲

    BIT

wKiom1NEyMfzD0ZlAAF700sDddE417.jpg


字符型

===========================

作爲非二進制對象存儲<不區分大小寫>

CHAR(定長), VARCHAR(變長)

TINYTEXT, TEXT, MEDIUTEXT, LONGTEXT

wKiom1NEyR_gWvVXAAEDpaHVTDM022.jpg

===========================

++++++++++++++++++++++++++++

作爲二進制對象存儲<區分大小寫.沒有字符集>

BINARY(0-255定長),

VARBINARY(65535變長)

TINYBLOB(Up to 255 bytes, 1bytes overhead)

BLOB(Up to 64 kb, 2bytes overhead)

MEDIUMBLOB(Up to 16M, 3bytes overhead)

LONGBLOB(Up to 4Gb, 4bytes overhead)

wKioL1NEySzwIz2TAAH0kcrqUtM307.jpg

++++++++++++++++++++++++++++

日期時間型

wKiom1NEyarDBaPTAAD-JYYdqa4140.jpg


2.常用修飾符

1)、字符串常用修飾符:只修飾字符型,不修飾二進制型

CHAR,VARCHAR和TEXT字符型常用的屬性修飾符:
1.NOT NULL:非空約束
2.NULL:允許
3.DEFAULT'string'默認值,僅用於char,varchar不適用於TEXT類型
4.CHARACTER SET '字符集'
    mysql>SHOW VARIABLES LIKE '%char%' 當前系統上的字符集
    mysql>SHOW CHARACTER SET 查看所有支持的字符集
    默認情況下如果沒有指定字符集它會去繼承表的,如果表也沒有指,就會繼承庫的,如果庫也沒有指,那麼會繼承服務器的。
5.COLLATION '規則'
    查看本機上面排序規則 mysql>SHOW COLLATION;
BINARY,VARBINARY和BLOB只用三種修飾符(NULL, NOT NULL, DEFAULT:不適用於BLOB)
內置類型
ENUM   存儲的值字串
SET    集合,存儲的是組合索引
   修飾符:NOT NULL
          NULL
          DEFAULT 'string'

2)、整型常見的修飾符

整型的常用屬性修飾符:
     AUTO_INCREMENT:自動增長(前提:非空、且唯一;支持索引, 非負值)
批量插入的副作用:一次插入多行數據時,僅記錄第一個值
通過mysql>SELECT LAST_INSERT_ID();查看增長值,顯示結果並非精確
    mysql>TRUNCATE tb_name
     UNSIGNED:無符號
          mysql>LAST_INSERT_ID();顯示結果並非精確
          mysql>TURNCATE tb_name;
浮點型常用屬性修飾符
     NULL
     NOT NULL
     DEFAULT
     UNSINGNED

任何字符型必須加引號,任何數值型不能加!

3)、日期時間型的修飾符

NOT NULL
NULL
DEFAULT


四、SQL 模式:

TRADITIONAL           傳統模式
STRICT_TRANS_TABLES   僅對支持事務的表,嚴格模式
STRICT_ALL_TABLES     對所有表都是用嚴格模式

系統默認使用的是空模式


設定服務器變量的值:(僅於支持動態的變量)

   支持修改的服務器變量

       動態變量

            可以在Mysql運行是修改

       靜態變量

            在配置文件中修改其值,並重啓後方能修改


服務器變量從其生效範圍來講,有兩類:

  全局變量:服務器級別,修改之後僅對新建立的會話有效

  會話變量:會話級別,僅對當前會話有效;會話建立時,從全局繼承各變量


查看服務器變量三種方式:

mysql>SHOW [{GLOBAL|SESSION}] VARIABLES [LIKE ''];
mysql>SETLECT @@{GLOBAL|SESSION}.sql_mode;
mysql>SETLECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME='SOME_VARIABLE_NAME';

修改變量:前提:默認僅管理員有權限修改全局變量

mysql> SET {GLOBAL|SESSION} VARIABLE_NAME='VALUE';

注意:無論是全局還是會話級別的動態變量修改,在重啓mysqld後都會失效;想永久有效,可定義在配置文件中的[mysqld]段落中!


五、Mysql中字符大小寫:

1.SQL關鍵字及函數名不區分字符大小寫;要麼大寫、要麼小寫

2.數據庫、表以及視圖名稱的大小寫區分與否取決於底層OS及File System;

3.存儲過程、存儲函數及時間調度器的名稱不區分大小寫,但觸發器區分;

4.表的別名區分大小寫

5.對於字段中的數據,如果字段類型爲Binary類型,則區分大小寫,非Binary不區分大小寫;




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