linux進(jìn)階之mariadb(二)索引、日志

mariadb的索引

索引:提取索引的創(chuàng)建在的表上字段中的數(shù)據(jù)白嘁,構(gòu)建出一個(gè)獨(dú)特的數(shù)據(jù)結(jié)構(gòu)坑鱼;

索引的作用:加速查詢操作;副作用:降低寫操作性能絮缅;

表中數(shù)據(jù)子集:把表中某個(gè)或某些字段的數(shù)據(jù)提取出來另存為一個(gè)特定數(shù)據(jù)結(jié)構(gòu)組織的數(shù)據(jù)鲁沥;
某個(gè)字段或某些字段:WHERE子句中用到的字段     

索引類型:B+ TREE,HASH

B+ TREE:順序存儲(chǔ)耕魄,每一個(gè)葉子結(jié)點(diǎn)到根結(jié)點(diǎn)的距離相同画恰;左前綴索引,適合于范圍類型的數(shù)據(jù)查詢吸奴;
    適用于B+ TREE索引的查詢類型:全鍵值允扇、鍵值范圍或鍵前綴;
    全值匹配:精確匹配某個(gè)值则奥;
        WHERE COLUMN = 'value';
    匹配最左前綴:只精確匹配起頭的部分考润;
            WEHRE COLUMN LIKE 'PREFIX%';                        
    匹配范圍值:
        精確匹配某一列,范圍匹配另一列逞度;
        只用訪問索引的查詢:覆蓋索引额划;
            index(Name)
            SELECT Name FROM students WHERE Name LIKE 'L%';                     
    不適用B+ TREE索引:
        如果查詢條件不是從最左側(cè)列開始,索引無效档泽;
            index(age,Fname), WHERE Fname='Jerry';    , WHERE age>30 AND Fname='Smith';
        不能跳過索引中的某列俊戳;
            index(name,age,gender)
                WHERE name='black' and age > 30;
                WHERE name='black' AND gender='F';
        如果查詢中的某個(gè)列是為范圍查詢揖赴,那么其右側(cè)的列都無法再使用索引優(yōu)化查詢;
                WHERE age>30 AND Fname='Smith';

Hash索引:基于哈希表實(shí)現(xiàn)抑胎,特別適用于值的精確匹配查詢燥滑;

    適用場景:
        只支持等值比較查詢,例如=, IN(), <=>
    不用場景:
        所有非精確值查詢阿逃;MySQL僅對memory存儲(chǔ)引擎支持顯式的hash索引铭拧;

索引優(yōu)點(diǎn):

降低需要掃描的數(shù)據(jù)量,減少IO次數(shù)恃锉;
可以幫助避免排序操作搀菩,避免使用臨時(shí)表; 
幫助將隨機(jī)IO轉(zhuǎn)為順序IO破托;

高性能索引策略:

(1) 在WHERE中獨(dú)立使用列肪跋,盡量避免其參與運(yùn)算;
    WHERE age+2 > 32 ; 
(2) 左前綴索引:索引構(gòu)建于字段的最左側(cè)的多少個(gè)字符土砂,要通過索引選擇性來評(píng)估
    索引選擇性:不重復(fù)的索引值和數(shù)據(jù)表的記錄總數(shù)的比值州既;
(3) 多列索引:
    AND連接的多個(gè)查詢條件更適合使用多列索引,而非多個(gè)單鍵索引萝映;
(4) 選擇合適的索引列次序:選擇性最高的放左側(cè)吴叶;

EXPLAIN來分析索引有效性:

EXPLAIN [explain_type] SELECT select_options
    explain_type:
        EXTENDED
        | PARTITIONS    
MariaDB [mysql]> EXPLAIN  SELECT user from user;
+------+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
| id   | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
+------+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
|    1 | SIMPLE      | user  | index | NULL          | PRIMARY | 228     | NULL |    3 | Using index |
+------+-------------+-------+-------+---------------+---------+---------+------+------+-------------+

id:當(dāng)前查詢語句中,第個(gè)SELECT語句的編號(hào)序臂;

- 復(fù)雜的查詢的類型主要三種:
    - 簡單子查詢
    - 用于FROM中的子查詢
    - 聯(lián)合查詢
    - 注意:聯(lián)合查詢的分析結(jié)果會(huì)出現(xiàn)一個(gè)額外的匿名臨時(shí)表蚌卤;

select_type:查詢類型:

- 簡單查詢:SIMPLE
- 復(fù)雜查詢:
- 簡單子查詢:SUBQUERY
    - 用于FROM中的子查詢:DERIVED
    - 聯(lián)合查詢中的第一個(gè)查詢:PRIMARY
    - 聯(lián)合查詢中的第一個(gè)查詢之后的其它查詢:UNION
    - 聯(lián)合查詢生成的臨時(shí)表:UNION RESULT

table:查詢針對的表;
type:關(guān)聯(lián)類型奥秆,或稱為訪問類型造寝,即MySQL如何去查詢表中的行

- ALL:全表掃描;
- index:根據(jù)索引的順序進(jìn)行的全表掃描吭练;但同時(shí)如果Extra列出現(xiàn)了"Using index”表示使用了覆蓋索引;
- range:有范圍限制地根據(jù)索引實(shí)現(xiàn)范圍掃描析显;掃描位置始于索引中的某一項(xiàng)鲫咽,結(jié)束于另一項(xiàng);
- ref:根據(jù)索引返回的表中匹配到某單個(gè)值的所有行(匹配給定值的行不止一個(gè))谷异;
- eq_ref:根據(jù)索引返回的表中匹配到某單個(gè)值的單一行分尸,僅返回一個(gè)行,但需要與某個(gè)額外的參考值比較歹嘹,而不是常數(shù)箩绍;
- const,system:與某個(gè)常數(shù)比較尺上,且只返回一行材蛛;

possiable_keys:查詢中可能會(huì)用到的索引圆到;
key:查詢中使用的索引;
key_len:查詢中用到的索引長度卑吭;
ref:在利用key字段所顯示的索引完成查詢操作時(shí)所引用的列或常量值芽淡;
rows:MySQL估計(jì)出的為找到所有的目標(biāo)項(xiàng)而需要讀取的行數(shù);
Extra:額外信息

- Using index:使用了覆蓋索引進(jìn)行的查詢豆赏;
- Using where:拿到數(shù)據(jù)后還要再次進(jìn)行過濾挣菲; 
- Using temporary:使用了臨時(shí)表以完成查詢;
- Using filesort:對結(jié)果使用了一個(gè)外部索引排序掷邦;

日志

查詢?nèi)罩荆篻eneral_log

查詢?nèi)罩?記錄查詢語句白胀,日志存儲(chǔ)位置:
    文件:file
    表:table (mysql.general_log)
        general_log={ON|OFF}是否記錄所有語句的日志信息與一般查詢?nèi)罩疚募╣eneral_log_file)
        general_log_file=HOSTNAME.log 
        log_output={FILE|TABLE|NONE}

慢查詢?nèi)罩荆簂og_slow_queries

慢查詢:運(yùn)行時(shí)間超出指定時(shí)長的查詢;
    long_query_time
    存儲(chǔ)位置:
        文件:FILE
        表:TABLE抚岗,mysql.slog_log
        log_slow_queries={ON|OFF}是否記錄慢查詢?nèi)罩?        slow_query_log={ON|OFF}
        slow_query_log_file= 定義慢查詢?nèi)罩镜谋4嫖募?        log_output={FILE|TABLE|NONE}
        log_slow_filter=admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk不記錄慢查詢?nèi)罩镜膭?dòng)作或者事務(wù)
        log_slow_rate_limit 定義慢查詢的時(shí)間限制
        log_slow_verbosity

錯(cuò)誤日志:log_error或杠, log_warnings

記錄如下幾類信息:
    (1) mysqld啟動(dòng)和關(guān)閉過程中輸出的信息; 
    (2) mysqld運(yùn)行中產(chǎn)生的錯(cuò)誤信息苟跪; 
    (3) event scheduler運(yùn)行時(shí)產(chǎn)生的信息廷痘;
    (4) 主從復(fù)制架構(gòu)中,從服務(wù)器復(fù)制線程啟動(dòng)時(shí)產(chǎn)生的日志件已;
        log_error=/var/log/mariadb/mariadb.log|OFF
        log_warnings={ON|OFF} 

二進(jìn)制日志:binlog

用于記錄引起數(shù)據(jù)改變或存在引起數(shù)據(jù)改變的潛在可能性的語句(STATEMENT)或改變后的結(jié)果(ROW)笋额,也可能是二者混合;
功用:“重放”
binlog_format={STATEMENT|ROW|MIXED}
STATEMENT:語句篷扩;
ROW:行兄猩;
MIXED:混編;
查看二進(jìn)制日志文件列表:
SHOW MASTER|BINARY LOGS;
查看當(dāng)前正在使用的二進(jìn)制日志文件:
SHOW MASTER STATUS鉴未;
查看二進(jìn)制 日志文件中的事件:
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
服務(wù)器變量:
log_bin=/PATH/TO/BIN_LOG_FILE
只讀變量;
session.sql_log_bin={ON|OFF}
控制某會(huì)話中的“寫”操作語句是否會(huì)被記錄于日志文件中铜秆;
max_binlog_size=1073741824
sync_binlog={1|0}
mysqlbinlog:
YYYY-MM-DD hh:mm:ss
--start-datetime=
--stop-datetime=
-j, --start-position=#
--stop-position=#
--user, --host, --password

常用的二進(jìn)制日志選項(xiàng):

log_bin = {ON|OFF},也可以是一個(gè)文件路徑
log_bin_trust_function_creators 不阻止任何存儲(chǔ)函數(shù)
sql_log_bin = {ON|OFF} 當(dāng)前會(huì)話是否將修改記入到二進(jìn)制文件中
sql_log_off 是否將一般查詢記入到查詢?nèi)罩局?sync_binlog 同步緩沖區(qū)二進(jìn)制到應(yīng)到的時(shí)間淹真,0表示不急于時(shí)間同步连茧,旨在時(shí)間提交時(shí)同步
binlog_format={statement|row|mixed}
max_binlog_cache_size MariaDB二進(jìn)制日志的緩存區(qū)大小,僅用于緩存事務(wù)類的語句
max_binlog_stmt_cache_size 語句緩存區(qū)大小啸驯,即事務(wù)類和非事務(wù)類公用的大小 
max_binlog_size 二進(jìn)制日志文件的上限客扎,單位為字節(jié)
建議:切勿將二進(jìn)制日志與數(shù)據(jù)文件放在同一設(shè)備上
可以臨時(shí)通過sql_log_bin來控制未禁止的寫入

二進(jìn)制日志事件格式:

[root@test1 mysql]# mysqlbinlog maste-log.000003 > /test.log
[root@test1 mysql]# cat /test.log 
# at 480
#170916 16:24:14 server id 1  end_log_pos 563   Query   thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1505549921/*!*/;

對上解釋:
事件的起始位置:# at 480
事件發(fā)生的日期時(shí)間:#170916 16:24:14
事件發(fā)生的服務(wù)器id:server id 1
事件的結(jié)束位置:end_log_pos 563
事件的類型:Query
事件發(fā)生時(shí)所在服務(wù)器執(zhí)行此事件的線程的ID: thread_id=2
語句的時(shí)間戳與將其寫入二進(jìn)制日志文件中的時(shí)間差:exec_time=0
錯(cuò)誤代碼:error_code=0
設(shè)定事件發(fā)生時(shí)的時(shí)間戳:SET TIMESTAMP=1505549921/!/;
事件內(nèi)容:(這里是會(huì)有不同的執(zhí)行動(dòng)作)

中繼日志:

從服務(wù)器上記錄下來從主服務(wù)器的二進(jìn)制日志文件同步過來的事件;
對于非從服務(wù)器中繼日志沒有啟用
       relay_log_purge = {ON|OFF} 是否自動(dòng)清理不在需要的中繼日志
       relay_log_space_limit 中繼大小是否限制

事務(wù)日志:

事務(wù)型存儲(chǔ)引擎innodb用于保證事務(wù)特性的日志文件:     
    redo log 
    undo log 

清除日志:

  PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr(某個(gè)時(shí)間點(diǎn)之前) }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末罚斗,一起剝皮案震驚了整個(gè)濱河市徙鱼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌针姿,老刑警劉巖袱吆,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厌衙,死亡現(xiàn)場離奇詭異,居然都是意外死亡杆故,警方通過查閱死者的電腦和手機(jī)迅箩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來处铛,“玉大人饲趋,你說我怎么就攤上這事〕敷。” “怎么了奕塑?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長家肯。 經(jīng)常有香客問我龄砰,道長,這世上最難降的妖魔是什么讨衣? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任换棚,我火速辦了婚禮,結(jié)果婚禮上反镇,老公的妹妹穿的比我還像新娘固蚤。我一直安慰自己,他們只是感情好歹茶,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布夕玩。 她就那樣靜靜地躺著,像睡著了一般惊豺。 火紅的嫁衣襯著肌膚如雪燎孟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天尸昧,我揣著相機(jī)與錄音揩页,去河邊找鬼。 笑死烹俗,一個(gè)胖子當(dāng)著我的面吹牛碍沐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播衷蜓,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼尘喝!你這毒婦竟也來了磁浇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對情侶失蹤置吓,失蹤者是張志新(化名)和其女友劉穎无虚,沒想到半個(gè)月后衍锚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡度宦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了戈抄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡划鸽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出裸诽,到底是詐尸還是另有隱情,我是刑警寧澤丈冬,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站殷蛇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏粒梦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一匀们、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧准给,春花似錦、人聲如沸露氮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春畜埋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背畴蒲。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留模燥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓心肪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親纠吴。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 目錄: 1.查詢?nèi)罩?2.慢查詢?nèi)罩?3.錯(cuò)誤日志 4.二進(jìn)制日志 5.中斷日志 6.事物日志 一固该、查詢?nèi)罩?ge...
    BossHuang閱讀 2,417評(píng)論 0 0
  • 日志備份和恢復(fù)MySQL Replication 復(fù)制 一糖儡、日志: 日志的分類:查詢?nèi)罩荆篻eneral_log慢...
    哈嘍別樣閱讀 425評(píng)論 0 0
  • 《高性能MySQL》&《MySQL技術(shù)內(nèi)幕 InnoDB存儲(chǔ)引擎》筆記 第一章 MySQL架構(gòu)與歷史 MySQL的...
    xiaogmail閱讀 12,734評(píng)論 0 39
  • Mysql 有4種類型的日志:Error Log、Genaral Query Log握联、 Binary Log 和 ...
    人在碼途閱讀 16,378評(píng)論 2 11
  • 總覺得舞陽公子這個(gè)名字太狂妄,有點(diǎn)不知道天高地厚金闽,早就打算換名。因?yàn)榧亦l(xiāng)在山東代芜,徒駭河北岸,一片平原并無山巒挤庇,所...
    徒駭北閱讀 204評(píng)論 0 1