1、 導入hellodb.sql生成數(shù)據(jù)庫
(1) 在students表中,查詢年齡大于25歲,且為男性的同學的名字和年齡
(2) 以ClassID為分組依據(jù),顯示每組的平均年齡
(3) 顯示第2題中平均年齡大于30的分組及平均年齡
(4) 顯示以L開頭的名字的同學的信息
[root@Centos8 ~]# dnf install -y mariadb-server;systemctl enable --now mariadb
[root@Centos8 ~]# mysql < hellodb_innodb.sql
MariaDB [hellodb]> select name,age from students where age >25 and gender ='M';
+--------------+-----+
| name | age |
+--------------+-----+
| Xie Yanke | 53 |
| Ding Dian | 32 |
| Yu Yutong | 26 |
| Shi Qing | 46 |
| Tian Boguang | 33 |
| Xu Xian | 27 |
| Sun Dasheng | 100 |
+--------------+-----+
7 rows in set (0.001 sec)
MariaDB [hellodb]> select classid,avg(age) from students group by classid;
+---------+----------+
| classid | avg(age) |
+---------+----------+
| NULL | 63.5000 |
| 1 | 20.5000 |
| 2 | 36.0000 |
| 3 | 20.2500 |
| 4 | 24.7500 |
| 5 | 46.0000 |
| 6 | 20.7500 |
| 7 | 19.6667 |
+---------+----------+
8 rows in set (0.001 sec)
MariaDB [hellodb]> select classid,avg(age) from students group by classid having AVG(age) > 30;
+---------+----------+
| classid | avg(age) |
+---------+----------+
| NULL | 63.5000 |
| 2 | 36.0000 |
| 5 | 46.0000 |
+---------+----------+
3 rows in set (0.004 sec)
MariaDB [hellodb]> select * from students where name like 'L%';
+-------+-------------+-----+--------+---------+-----------+
| StuID | Name | Age | Gender | ClassID | TeacherID |
+-------+-------------+-----+--------+---------+-----------+
| 8 | Lin Daiyu | 17 | F | 7 | NULL |
| 14 | Lu Wushuang | 17 | F | 3 | NULL |
| 17 | Lin Chong | 25 | M | 4 | NULL |
+-------+-------------+-----+--------+---------+-----------+
3 rows in set (0.000 sec)
2、數(shù)據(jù)庫授權magedu用戶,允許192.168.1.0/24網(wǎng)段可以連接mysql
mysql8.0前,創(chuàng)建并賦權
grant Usage on *.* to magedu@'192.168.0.%' identified by '123';
mysql8.0,必須先創(chuàng)建后賦權
create user magedu@'192.168.1.%' identified by '123';
grant Usage on *.* to magedu@'192.168.1.%';
2、總結mysql常見的存儲引擎以及特點。
MyISAM 引擎特點
- 不支持事務
- 表級鎖定
- 讀寫相互阻塞,寫入不能讀,讀時不能寫
- 只緩存索引
- 不支持外鍵約束
- 不支持聚簇索引
- 讀取數(shù)據(jù)較快,占用資源較少
- 不支持MVCC(多版本并發(fā)控制機制)高并發(fā)
- 崩潰恢復性較差
- MySQL5.5.5 前默認的數(shù)據(jù)庫引擎
MyISAM 存儲引擎適用場景 - 只讀(或者寫較少)
- 表較?。梢越邮荛L時間進行修復操作)
MyISAM 引擎文件 - tbl_name.frm 表格式定義
- tbl_name.MYD 數(shù)據(jù)文件
- tbl_name.MYI 索引文件
InnoDB引擎特點
- 行級鎖
- 支持事務,適合處理大量短期事務
- 讀寫阻塞與事務隔離級別相關
- 可緩存數(shù)據(jù)和索引
- 支持聚簇索引
- 崩潰恢復性更好
- 支持MVCC高并發(fā)
- 從MySQL5.5后支持全文索引
- 從MySQL5.5.5開始為默認的數(shù)據(jù)庫引擎
InnoDB數(shù)據(jù)庫文件
- 所有InnoDB表的數(shù)據(jù)和索引放置于同一個表空間中
- 每個表單獨使用一個表空間存儲表的數(shù)據(jù)和索引
- 啟用:innodb_file_per_table=ON (MariaDB 5.5以后版是默認值)
- 參看:https://mariadb.com/kb/en/library/xtradbinnodb-server-system-variables/#innodb_file_pe
r_table
3、總結MySQL查詢緩存優(yōu)化總結。
MySQL查詢緩存解釋
緩存完整的SELECT查詢結果,也就是查詢緩存。保存查詢返回的完整結果。當查詢命中該緩存,mysql會立刻返回結果,跳過了解析、優(yōu)化和執(zhí)行階段,查詢緩存系統(tǒng)會跟蹤查詢中涉及的每個表,如果這些表發(fā)生變化,那么和這個表相關的所有數(shù)據(jù)都將失效
命中條件
Mysql判斷緩存命中的方法很簡單:緩存存放在一個引用表中,通過一個哈希值引用,這個哈希值包括如下因素,即查詢本身、當前要查詢的數(shù)據(jù)庫、客戶端協(xié)議的版本等一些都有可能影響返回結果信息。
當判斷查詢緩存是否命中時,Mysql不會解析、正規(guī)化或者參數(shù)化的查詢語句,而是直接使用Sql語句和客戶端發(fā)送過來的其他原始信息(Sql)。任何字符上的不同,例如注釋,任何的不同都會導致緩存不命中,所以在編寫Sql語句的時候,需要特別注意這一點,通常使用統(tǒng)一的編碼規(guī)則是一個好的習慣,在這里這個好習慣可能讓你的系統(tǒng)運行的更快
當查詢語句有一些不確定的數(shù)據(jù)時,則不會被緩存,例如白喊函數(shù)NOW()或者CURRENTDATE()的查詢不會被緩存
如果查詢語句中包含任何不確定的函數(shù),那么在查詢緩存中是不可能找到緩存結果的,即使之前剛剛執(zhí)行這樣的查詢
導致沒有命中條件
1、緩存碎片
2、內存不足
3、數(shù)據(jù)修改
特別注意
Mysql的查詢緩存在很多時候可以提升查詢性能,在使用的時候,有一些問題需要特別注意。首先,打開查詢緩存對 讀,寫 操作都會帶來額外的消耗:
1、讀查詢在開始之前必須先檢查是否命中緩存
2、如果這個讀查詢可以被緩存,那么當完成執(zhí)行后,Mysql若發(fā)現(xiàn)查詢緩存中沒有這個查詢,會將其結果存入查詢緩存,這會帶來額外的系統(tǒng)開銷
3、這對寫操作也會影響,因為當向某個表寫入數(shù)據(jù)的時候,Mysql必須將對應表的所有緩存都設置失效。
4、對于存儲引擎InnoDB用戶來說,事務的一些特性會限制查詢緩存的作用。當一個語句在事務中修改某個表,Mysql會將這個表對應的查詢緩存都設置失效。在事務提交前該表的查詢都無法被緩存,只能在事務提交后才能被緩存。因此長時間運行的事務,會大大降低查詢緩存的命中率
5、inner JOIN 和 其他連接 查詢 如果其中一個表數(shù)據(jù)發(fā)生變化 則直接導致 緩存失效
緩存配置參數(shù)
query_cache_type: 是否打開緩存
可選項
- OFF: 關閉
- ON: 總是打開
- DEMAND: 只有明確寫了SQL_CACHE的查詢才會吸入緩存
如果不想所有查詢都進入查詢緩存,但是又希望某些查詢走查詢緩存,那么可以將 query_cache_type 設置成 DEMAND ,然后在希望緩存的查詢上加上SQL_CACHE。這雖然需要在查詢中加入額外的語法,但是可以讓你非常自由的控制那些查詢需要被緩存。相反如果不希望緩存 加上SQL_NO_CACHE
4、MySQL日志各類總結。
1. 概述
與大多數(shù)關系型數(shù)據(jù)庫,日志文件是MySQL數(shù)據(jù)庫的一個重要組成部分。MySQL有幾種不同的日志文件,通常包括錯誤日志文件,二進制日志,通用日志,慢查詢日志,等等。
這些日志能夠幫助我們定位mysqld內部發(fā)生的事件,數(shù)據(jù)庫性能故障。記錄數(shù)據(jù)的變更歷史,用戶恢復數(shù)據(jù)庫等等。
2. mysql日志組成
(1)錯誤日志:記錄啟動、運行或停止mysqld時出現(xiàn)的問題。
(2)通用日志:記錄建立的client連接和運行的語句。
(3)更新日志:記錄更改數(shù)據(jù)的語句。該日志在MySQL 5.1中已不再使用。
(4)二進制日志:記錄全部更改數(shù)據(jù)的語句。還用于復制。
(5)慢查詢日志:記錄全部運行時間超過long_query_time秒的全部查詢或不使用索引的查詢。
(6)Innodb日志:innodb redo log
缺省情況下,全部日志創(chuàng)建于mysqld數(shù)據(jù)文件夾中。
能夠通過刷新日志。來強制mysqld來關閉和又一次打開日志文件(或者在某些情況下切換到一個新的日志)。
當你運行一個FLUSH LOGS語句或運行mysqladmin flush-logs或mysqladmin refresh時,則日志被老化。
對于存在MySQL復制的情形下,從復制server將維護很多其它日志文件,被稱為接替日志。
3. 通用查詢日志
3.1 啟動和設置通用查詢日志
通用查詢日志記錄了mysql的所有用戶操作,包括啟動和關閉服務、執(zhí)行查詢和更新語句等。
mysql服務器默認情況下并沒有開啟通用查詢日志。如果需要通用查詢日志,可以通過修改my.ini或my.cnf配置文件來開啟。在my.ini或my.cnf的[mysqld]組下加入log選項或者啟動mysql時通過–log[=file_name]或-l [file_name]選項啟動它。假設沒有給定file_name的值, 默認名是host_name.log。通用查詢日志將默認存儲在mysql數(shù)據(jù)目錄中的hostname.log文件中。hostname是mysql數(shù)據(jù)庫的主機名
my.in中形式如下:
[mysqld]
log[=path/[filename]]
mysqld依照它接收的順序記錄語句到查詢日志。這可能與運行的順序不同。
不同于更新日志和二進制日志,它們在查詢運行后??墒遣徽撌裁匆粋€鎖釋放之前記錄日志。
查詢日志包括全部語句,而二進制日志不包括僅僅查詢數(shù)據(jù)的語句。
server又一次啟動和日志刷新不會產(chǎn)生新的一般查詢日志文件。
3.2 查看通用查詢日志
通用查詢日志中記錄了用的所有操作。通過查看通用查詢日志,可以了解用戶對mysql進行的操作。通用查詢日志是以文本文件形式存儲在文件系統(tǒng)中的,可以使用文本編輯器直接打開通用日志文件進行查看,Windows下可以使用記事本,Linux下可以使用vim、gedit等
3.3 刪除通用查詢日志
通用查詢日志是以文本文件的形式存儲在文件系統(tǒng)中的。通用查詢日志記錄用戶的所有操作,因此在用戶查詢、更新頻繁的情況下,通用查詢日志會增長得很快。DBA可以定期刪除比較早的通用日志,以節(jié)省磁盤空間,可以用直接刪除日志文件的方式刪除通用查詢日志。要重新建立新的日志文件,可使用語句:
mysqladmin -flush logs
或者直接刪除日志文件。
3.4 通用查詢日志的系統(tǒng)變量
log_output=[none|file|table|file,table] #通用查詢日志輸出格式
general_log=[on|off] #是否啟用通用查詢日志
general_log_file[=filename] #通用查詢日志位置及名字
4. 二進制日志
二進制日志就是我們經(jīng)常說的binlog,主要記錄mysql數(shù)據(jù)庫的變化。
二進制日志以一種有效的格式,并且是事務安全的方式包含更新日志中可用的所有信息。
二進制日志包含關于每個更新數(shù)據(jù)庫的語句的執(zhí)行時間信息。他不包含沒有修改任何數(shù)據(jù)的語句,例如select語句
使用二進制日志的最大目的是最大可能地恢復數(shù)據(jù)庫,因為二進制日志包含備份后進行的所有更新.
4.1 啟動和設置二進制日志
默認情況下,二進制日志是關閉的,可以通過修改mysql的配置文件來啟動和設置二進制日志,my.ini中[mysqld]組下面有幾個設置是關于二進制日志的:
log-bin[=PATH/[FILENAME]]
expire_logs_days=10
max_binlog_size=100M
log-bin定義開啟二進制日志;path表明日志文件所在的目錄路徑;
filename指定了日志文件的名稱,如文件的全名是filename.0001,filename.0002等,除了上述文件之外,還有一個成為filename.index的文件,文件內容為所有日志的清單,可以使用記事本打開該文件filename.index文件的內容,當前只有一個binlog文件:.\C:\ProgramData\MySQL\MySQL Server 5.7\logs\bin-log.000001
expire_logs_days定義了mysql清除過期日志的時間,即二進制日志自動刪除的天數(shù)。默認值為0,表示“沒有自動刪除”。當mysql啟動或刷新二進制日志時可能刪除該文件
max_binlog_size定義了單個文件的大小限制,如果二進制日志寫入的內容大小超出給定值,日志就會發(fā)生滾動(關閉當前文件,重新打開一個新的日志文件)。不能將該變量設置為大于1GB或小于4096字節(jié)。默認值是1GB,如果正在使用大事務 ,二進制日志文件大小還可能超過max_binlog_size的定義大小。
可以通過SHOW VARIABLES語句來查詢日志設置,使用show VARIABLES 語句查看日志設置

可以看到log_bin為ON,max_binlog_size為104857600字節(jié),換算為MB為100MB,MYSQL重新啟動之后,就可以看到新產(chǎn)生的文件后綴為.000001和.index的兩個文件,文件名稱默認為主機名稱,我已經(jīng)在配置文件中指定了文件名,所以不會以默認主機名生成,如下,因為我之前就開啟了二進制日志,所以重啟后后綴為000002:
4.2 查看二進制日志
mysql二進制日志是經(jīng)常用到的。當mysql創(chuàng)建二進制日志文件時,首先創(chuàng)建一個以filename為名稱,以index為后綴的文件;
再創(chuàng)建一個以filename為名稱,以“.000001”為后綴的文件。當mysql服務重新啟動一次,以“.000001”為后綴的文件會增加一個,
并且后綴名加1遞增;如果日志長度超過了max_binlog_size的上限(默認是1GB)也會創(chuàng)建一個新的日志文件
show binary logs語句可以查看當前二進制日志文件個數(shù)和文件名。mysql二進制日志并不能直接查看,如果要查看日志內容,
可以通過mysqlbinlog命令查看,使用show binary logs語句查看二進制日志文件個數(shù)和文件名:

可以看到,當前有兩個二進制日志文件,因為我把mysql服務重啟了一次,日志文件的個數(shù)和mysql服務啟動的次數(shù)相同。每啟動一次mysql服務,將會產(chǎn)生一個新的日志文件,使用mysqlbinlog查看二進制日志,mysqlbinlog是一個單獨的exe,需要在命令行里執(zhí)行我們把binlog文件里面的內容導出到binlog.txt
4.3 刪除二進制日志
mysql的二進制日志可以配置自動刪除,同時mysql也提供了安全的手動刪除二進制日志的方法,刪除所有的二進制日志文件使用
RESET MASTER;
執(zhí)行該語句,所有二進制日志將被刪除,mysql 會重新創(chuàng)建二進制日志,新的日志文件擴展名將重新從000001開始編號,只刪除部分二進制日志文件使用PURGE MASTER LOGS;語法如下:
PURGE {MASTER | BINARY} LOGS TO
'log_name'
PURGE {MASTER | BINARY} LOGS BEFORE 'date'
第一種方法指定文件名,執(zhí)行該命令將刪除文件名編號比指定文件名編號小的所有日志文件
第二種方法指定日期,執(zhí)行該命令將刪除指定日期以前的所有日志文件。
4.4 查看二進制日志里的操作記錄
使用如下命令:show binlog events;
比如想查看某一個二進制日志里面的記錄,但又不想用mysqlbinlog,可以使用show binlog events
比如我想查看’bin-log.000002′這個binlog文件的內容,執(zhí)行如下命令:

可以看到’bin-log.000002′這個binlog文件記錄了哪些SQL命令,如果想知道binlog文件的創(chuàng)建時間,就需要mysqlbinlog工具來查看
4.5 使用二進制日志還原數(shù)據(jù)庫
如果mysql服務器啟用了二進制日志,在數(shù)據(jù)庫出現(xiàn)意外丟失數(shù)據(jù)時,可以使用mysqlbinlog工具從指定的時間點開始(例如,最后一次備份)直到現(xiàn)在,或另外一個指定的時間點的日志中恢復數(shù)據(jù),要想從二進制日志恢復數(shù)據(jù),需要知道當前二進制日志文件的路徑和文件名。一般可以從配置文件(即my.cnf或者my.ini,文件名取決于mysql服務器的操作系統(tǒng))中找到路徑.
mysqlbinlog恢復數(shù)據(jù)的語法如下:
mysqlbinlog [option] filename |mysql -uuser -ppass
option是一些可選項,filename是日志文件名,比較重要的兩對option參數(shù)是
–start-datetime、–stop-datetime
–start-position、–stop–position
–start-date、–stop-date可以指定恢復數(shù)據(jù)庫的起始時間點和結束時間點
–start-position、–stop–position可以指定恢復數(shù)據(jù)的開始位置和結束位置
4.6 暫時停止二進制日志
如果在mysql的配置文件配置啟動了二進制日志,mysql會一直記錄二進制日志,修改配置文件,可以停止二進制日志,
但是需要重啟mysql數(shù)據(jù)庫。mysql提供了暫時停止二進制日志的功能。通過 SET SQL_LOG_BIN 語句可以使mysql暫?;蛘邌佣M制日志
SET sql_log_bin={0|1}
其中0是停止,其實啟用
5. 錯誤日志
錯誤日志文件包含了當mysqld啟動和停止時,以及服務器在運行過程中發(fā)生任何嚴重錯誤時的相關信息。
在MYSQL中,錯誤日志也是非常重要的,mysql將啟動和停止數(shù)據(jù)庫信息以及一些錯誤信息記錄到錯誤日志中
5.1 啟動和設置錯誤日志
在默認情況下,錯誤日志會記錄到數(shù)據(jù)庫的數(shù)據(jù)目錄下。如果沒有在配置文件中指定文件名,則文件名默認為hostname.err。
例如:mysql所在服務器主機名為mysql-db,記錄錯誤信息的文件名為mysql-db.err。如果執(zhí)行了FLUSH LOGS,錯誤日志文件會重新加載
錯誤日志的啟動和停止以及日志文件名,都可以通過修改my.ini(或者my.cnf)來配置。錯誤日志的配置項是log-error。
在[mysqld]下配置log-error,在啟動錯誤日志。如果需要指定文件名,則配置項如下:
[mysqld]
log-error=[path/[file_name]]
path為日志文件所在的目錄路徑,filename為日志文件名。修改配置項后,需要重啟mysql服務才生效.
5.2 查看錯誤日志
通過錯誤日志可以監(jiān)視系統(tǒng)的運行狀態(tài),便于及時發(fā)現(xiàn)故障,修復故障。mysql錯誤日志是以文本文件形式存儲的,可以使用文本編輯器直接查看mysql錯誤日志,如果不知道日志文件的存儲路徑,可以使用 show variables; 語句查看錯誤日志的存儲路徑。
語句如下:
show variables LIKE 'log_error';
5.3 刪除錯誤日志
mysql的錯誤日志以文本文件的形式存儲在文件系統(tǒng)中,可以直接刪除,對于mysql5.5.7以前的版本,flush logs可以將錯誤日志文件重命名為filename.err_old,并創(chuàng)建新的日志文件。但是從mysql5.5.7開始,flush logs只是重新打開日志文件,并不做日志備份和創(chuàng)建的操作。
如果日志文件不存在,mysql啟動或者執(zhí)行flush logs時會創(chuàng)建新的日志文件,在運行狀態(tài)下刪除錯誤日志文件后,mysql并不會自動創(chuàng)建日志文件。flush logs在重新加載日志的時候,如果文件不存在,則會自動創(chuàng)建。所以在刪除錯誤日志之后,如果需要重建日志文件需要在服務器端執(zhí)行以下命令:
mysqladmin -u root -p flush-logs
或者在客戶端登錄mysql數(shù)據(jù)庫,執(zhí)行flush logs語句
flush logs;
刪除err文件,并用flush logs語句重建log-error文件.
6. 慢查詢日志
慢查詢日志是記錄查詢時長超過指定時間的日。慢查詢日志主要用來記錄執(zhí)行時間較長的查詢語句,通過慢查詢日志,可以找出執(zhí)行時間較長、執(zhí)行效率較低的語句,然后進行優(yōu)化
6.1 啟動和設置慢查詢日志
mysql中慢查詢日志默認是關閉的,可以通過配置文件my.ini或my.cnf中的log-slow-queries選項打開,也可以在mysql服務啟動的時候使用–log–slow-queries[=file_name]啟動慢查詢日志。啟動慢查詢日志時,需要在my.ini或者my.cnf文件中配置long_query_time選項指定記錄閥值,如果某條查詢語句的查詢時間超過了這個值,這個查詢過程將被記錄到慢查詢日志
文件中。
在my.ini或者my.cnf文件中開啟慢查詢日志的配置如下:
slow-query-log=1
slow_query_log_file="DESKTOP-EJUQL8D-slow.log"
long_query_time=10
path為日志文件所在目錄路徑,filename為日志文件名。如果不指定目錄和文件名稱,默認存儲在數(shù)據(jù)目錄中文件名為hostname-slow.log,hostname是mysql服務器的主機名。參數(shù)n是時間值,單位是秒。如果沒有設置long-query_time選項,默認時間為10秒
6.2 查看慢查詢日志
mysql的慢查詢日志是以文本形式存儲的,可以直接使用文本編輯器查看。在慢查詢日志中,記錄著執(zhí)行時間較長的查詢語句,用戶可以從慢查詢日志中獲取執(zhí)行效率較低的查詢語句,為查詢優(yōu)化提供重要的依據(jù),查看慢查詢日志的一些參數(shù)
show variables like '%slow%';
6.3 刪除慢查詢日志
和通用查詢日志一樣,慢查詢日志也可以直接刪除。刪除后在不重啟服務器的情況下,需要執(zhí)行
mysqladmin -u root -p flush logs
重新生成日志文件,或者在客戶端登錄到服務器執(zhí)行 flush logs; 語句重建日志文件,官方mysql的慢查詢日志在這里有一個缺陷,就是查詢閥值只能是1秒或以上,如果要設置一秒以下就無能為力了,這時候如果想找出1秒以下的慢查詢SQL,可以使用percona提供的microslow-patch來突破限制,將慢查詢時間閥值減小到毫秒級別
7. 總結
平時應打開哪些日志
日志既會影響mysql的性能,又會占用大量磁盤空間。因此,如果不必要,應盡可能少地開啟日志。
根據(jù)不同的使用環(huán)境,考慮開啟不同的日志。
例如開發(fā)環(huán)境中優(yōu)化查詢效率低的語句,可以開啟慢查詢日志,或者生產(chǎn)環(huán)境中發(fā)現(xiàn)某些SQL執(zhí)行特別慢也可以開啟
如果磁盤空間不是特充足可以在高峰期間開啟,在捕獲到查詢慢的SQL之后再關閉慢查詢日志
如果需要搭建復制環(huán)境,那么就一定要開啟二進制日志,如果數(shù)據(jù)特別重要也建議開啟二進制日志,以便數(shù)據(jù)庫損壞的時候也可以通過二進制日志
挽救一部分數(shù)據(jù)
通用日志無論在哪種情況下,一般不建議開啟