目錄
1、MySQL 簡介
概述
-
MySQL是一個關系型數據庫管理系統,由瑞典MySQL AB公司開發,目前屬於Oracle公司。
-
MySQL是一種關聯數據庫管理系統,將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加了速度並提高了靈活性。
-
Mysql是開源的,所以你不需要支付額外的費用。
-
Mysql支持大型的數據庫。可以處理擁有上千萬條記錄的大型數據庫。
-
MySQL使用標准的SQL數據語言形式。
-
Mysql可以允許於多個系統上,並且支持多種語言。這些編程語言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
-
Mysql對PHP有很好的支持,PHP是目前最流行的Web開發語言。
-
MySQL支持大型數據庫,支持5000萬條記錄的數據倉庫,32位系統表文件最大可支持4GB,64位系統支持最大的表文件為8TB。
-
Mysql是可以定制的,采用了GPL協議,你可以修改源碼來開發自己的Mysql系統。
高級MySQL涉及到知識
- mysql內核
- sql優化攻城獅
- mysql服務器的優化
- 各種參數常量設定
- 查詢語句優化
- 主從復制
- 軟硬件升級
- 容災備份
- sql編程
- 完整的mysql優化需要很深的功底,大公司甚至有專門的DBA寫上述
2、MySQL Linux版的安裝
- 此次安裝的是 MySQL 5.5, 安裝環境 CentOS 6.5
- 版本下載地址 官網下載地址
- 檢查當前系統是否安裝過MySQL
- 查詢命令:
rpm -qa|grep -i mysql
- 刪除命令:
rpm -e --nodeps RPM包全名
- 查詢命令:
- 安裝mysql服務端(注意提示)
- 安裝mysql客戶端
- 查看MySQL安裝時創建的mysql用戶和mysql組
# cat /etc/passwd | grep mysql
# cat /etc/group | grep mysql
- mysql服務的啟+停
- 查看MySQL啟停狀態:
# ps -ef | grep mysql
- 啟停操作:
# /etc/init.d/mysql start
# /etc/init.d/mysql stop
- 或者
#service mysql start
#service mysql stop
- 設置MySQL 自啟服務
#chkconfig mysql on
設置自動啟動# chkconfig --list | grep mysql
檢查是否設置了自動啟動
- 修改配置文件位置
- 拷貝當前5.5版本:
cp /usr/share/mysql/my-huge.cnf /etc/my.cnf
- 5.6版本
cp /usr/share/mysql/my-default.cnf /etc/my.cnf
- 拷貝當前5.5版本:
- 修改字符集和數據存儲路徑
- 查看字符集
show variables like 'character%';
show variables like '%char%';
- 默認的是客戶端和服務器都用了latin1,所以會亂碼。
- 修改字符集,修改之前copy 的配置文件。(詳細后續代碼)
- MySQL的安裝位置
- 在linux下查看安裝目錄
ps -ef|grep mysql
- 在linux下查看安裝目錄
- 查看字符集
- 查看MySQL啟停狀態:
路徑 | 解釋 | 備注 |
---|---|---|
/var/lib/mysql/ | mysql數據庫文件的存放路徑 | /var/lib/mysql/atguigu.cloud.pid |
/usr/share/mysql | 配置文件目錄 | mysql.server命令及配置文件 |
/usr/bin | 相關命令目錄 | mysqladmin mysqldump等命令 |
/etc/init.d/mysql | 啟停相關腳本 |
[client]
#password = your_password
port = 3306
socket = /var/lib/mysql/mysql.sock
# 這一行需要設置字符集
default-character-set=utf8
# The MySQL server
[mysqld]
port = 3306
# 還有這三行
character_set_server=utf8
character_set_client=utf8
collation-server=utf8_general_ci
socket = /var/lib/mysql/mysql.sock
skip-external-locking
key_buffer_size = 384M
max_allowed_packet = 1M
table_open_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 8
[mysql]
no-auto-rehash
# 還有這一行
default-character-set=utf8
3、Mysql配置文件
主要配置文件
- 二進制日志log-bin
- 主從復制
- 錯誤日志log-error
- 默認是關閉的,記錄嚴重的警告和錯誤信息,每次啟動和關閉的詳細信息等。
- 查詢日志log
- 默認關閉,記錄查詢的sql語句,如果開啟會減低mysql的整體性能,因為記錄日志也是需要消耗系統資源的
- 數據文件
- 兩系統
- windows
- D:\devSoft\MySQLServer5.5\data目錄下可以挑選很多庫
- Linux:
- 默認路徑
#cd /var/lib/mysql/
- 看看當前系統中的全部庫后再進去
#ls -1F | grep ^d
- 默認路徑
- windows
- frm文件: 存放表結構
- **myd文件: ** 存放表數據
- **myi文件: ** 存放表索引
- 兩系統
- 如何配置
- Windows: my.ini文件
- Linux: /etc/my.cnf文件
4、Mysql邏輯架構介紹
總體概覽
- 和其它數據庫相比,MySQL有點與眾不同,它的架構可以在多種不同場景中應用並發揮良好作用。主要體現在存儲引擎的架構上,插件式的存儲引擎架構將查詢處理和其它的系統任務以及數據的存儲提取相分離。這種架構可以根據業務的需求和實際需要選擇合適的存儲引擎。
- 1、連接層
- 最上層是一些客戶端和連接服務,包含本地sock通信和大多數基於客戶端/服務端工具實現的類似於tcp/ip的通信。主要完成一些類似於連接處理、授權認證、及相關的安全方案。在該層上引入了線程池的概念,為通過認證安全接入的客戶端提供線程。同樣在該層上可以實現基於SSL的安全鏈接。服務器也會為安全接入的每個客戶端驗證它所具有的操作權限。
- 2、服務層
- 第二層架構主要完成大多少的核心服務功能,如SQL接口,並完成緩存的查詢,SQL的分析和優化及部分內置函數的執行。所有跨存儲引擎的功能也在這一層實現,如過程、函數等。在該層,服務器會解析查詢並創建相應的內部解析樹,並對其完成相應的優化如確定查詢表的順序,是否利用索引等,最后生成相應的執行操作。如果是select語句,服務器還會查詢內部的緩存。如果緩存空間足夠大,這樣在解決大量讀操作的環境中能夠很好的提升系統的性能。
- 3、引擎層
- 存儲引擎層,存儲引擎真正的負責了MySQL中數據的存儲和提取,服務器通過API與存儲引擎進行通信。不同的存儲引擎具有的功能不同,這樣我們可以根據自己的實際需要進行選取。后面介紹MyISAM和InnoDB
- 4、存儲層
- 數據存儲層,主要是將數據存儲在運行於裸設備的文件系統之上,並完成與存儲引擎的交互。
查詢說明
- 首先,mysql的查詢流程大致是:
- mysql客戶端通過協議與mysql服務器建連接,發送查詢語句,先檢查查詢緩存,如果命中,直接返回結果,否則進行語句解析
- 有一系列預處理,比如檢查語句是否寫正確了,然后是查詢優化(比如是否使用索引掃描,如果是一個不可能的條件,則提前終止),生成查詢計划,然后查詢引擎啟動,開始執行查詢,從底層存儲引擎調用API獲取數據,最后返回給客戶端。怎么存數據、怎么取數據,都與存儲引擎有關。
- 然后,mysql默認使用的BTREE索引,並且一個大方向是,無論怎么折騰sql,至少在目前來說,mysql最多只用到表中的一個索引。
5、Mysql存儲引擎
- 查看命令
- 查看當前的MySQL 提供什么存儲引擎
mysql> show engines;
- 看你的 MySQL 當前默認的存儲引擎:
show variables like '%storage_engine%';
- 查看當前的MySQL 提供什么存儲引擎
MyISAM
和InnoDB
- 阿里巴巴、淘寶用哪個
- Percona 為 MySQL 數據庫服務器進行了改進,在功能和性能上較 MySQL 有着很顯著的提升。該版本提升了在高負載情況下的 InnoDB 的性能、為 DBA 提供一些非常有用的性能診斷工具;另外有更多的參數和命令來控制服務器行為。
- 該公司新建了一款存儲引擎叫
xtradb
完全可以替代innodb
,並且在性能和並發上做得更好, - 阿里巴巴大部分mysql數據庫其實使用的percona的原型加以修改。