mysql優化知識記錄

mysql 優化mysql


1.mysql優化是一個綜合性的,主要方向包括
    a:表的設計要符合三範式(3NF)
    b:添加適當的索引(index)四中常見索引:普通索引、主鍵索引、惟一索引unique、全文索引
    c:分表技術(水平分割、垂直分割)
    d:讀寫(update/delete /add)分離技術
    e:存儲過程 
    f:對mysql配置優化(對配置最大併發數修改 my.ini文件 max_connection通常調整到1000左右、調整緩存大小)
    g:mysql服務器硬件升級
    h:定時清除不須要的數據,定時進行碎片整理(MyISAM存儲引擎)sql


2.sql語句自己的優化
    問題是:如何從一個大項目中,迅速的定位執行速度慢的語句?定位慢查詢
    ①首相瞭解mysql數據庫的一些運行狀態如何查詢(好比當前mysql運行的時間/一共執行了多少次select語句/當前鏈接數等)
    show status   //顯示狀態
    show [session|global] status like ……   //默認是session 指的是取出當前窗口執行的次數
    show status like 'com_select'   //顯示執行了多少次select語句
    show status like 'connections'  //顯示鏈接數
    show status like 'slow_queries'  //顯示慢查詢次數
    步驟:①顯示mysql的慢查詢時間默認值單位是秒
        show variables like 'long_query_time'
          ②修改mysql的慢查詢時間默認值
        set long_query_time=1數據庫

    如何啓動慢查詢日誌?記錄查詢過的慢查詢語句
        默認狀況下mysql不記錄慢查詢,須要在啓動時指定參數
        啓動mysql的命令:    bin\mysql.exe --safe-mode --slow-query--log
        生成日誌文件在my.ini中的datadir指定的路徑下緩存


    3.添加索引
    1.主鍵
        添加索引
       方式a:    create table tableName(id int unsigned primary key auto_increment,name varchar(32
                    not null default '');
       方式b:    alter table tableName add primary key (列名);
    2.普通索引
        添加索引
        create table tableName (
            id int unsigned
            name varchar(10) not null default ''
        )
        create index 索引名 on 表名(列名)安全

    3.全文索引
        全文索引主要是針對對文本的檢索好比文章。
        添加索引
        create table tableName(
            id int unsigned primary key auto_increment,
            title varchar(200),
            body TEXT,
            FULLTEXT(title,body)
        )engine=myisam charset utf8;服務器

        如何使用全文索引
        錯誤的用法:
        select * from tableName where body like '%mysql%';【不會使用全文索引】
        正確的使用方法
        select * from tableName where match(title,body) against('querycharacter');session

        說明:
        a.在mysql中fulltext索引只針對myisam生效
        b.mysql本身提供的fulltext只針對英文生效,要處理中文可使用sphinx()
        c.使用方法是使用match(字段名……)
        mysql優化

    4.惟一索引
        添加索引
        方式a:  當表的某列被指定爲unique約束時,這就是一個惟一索引
            create table tableName(
                id int unsinged primary key auto_increment,
                name varchar(32) unique
            )engine = innodb charset utf8;併發

        這是name列就是一個惟一索引,unique字段能夠爲null,能夠多個 
        方式b:
            create table tableName(
                id int unsinged primary key auto_increment,
                name varchar(32)
           )engine = inodb charset utf8;
        create unique index 索引名 on 表名(列名)優化


        刪除索引
        alter table tableName drop index indexName

        查詢索引
        show index from tableName 


4.索引的注意事項
    a.佔用磁盤
    b.對dml語句有影響,會變慢,由於dml語句會影響btree。


5.什麼時候何地添加索引
    a.頻繁的做爲查詢條件的字段應該建立索引
    b.惟一性太差的字段不適合做爲索引,由於構建的btree不優秀,例如性別字段
    c.更新很是頻繁的字段不適合創建索引,dml語句會重建btree。
    d.不出如今where中的字段不該該創建索引

6.應該建立索引總結:
    a.確定在where條件中常用,
    b.該字段的內容不是惟一的幾個值例如gender
    c.字段內容不是常常變化的


7.sql語句中使用索引時的注意
    a.當sql中使用複合索引時,當條件語句中的字段是複合索引字段最左邊的字段就會使用索引
不然不會使用。explain sql語句 能夠幫助咱們不真正的執行sql語句,去看mysql的執行計劃。從爲去
優化sql 狀況。
    b.對於使用like查詢,若是‘%’寫在前面,是不會使用索引。非要使用%在前,那就只能不使
用索引,或者使用全文索引sphinx
    c.若是條件中有or,使用的全部字段都必須創建索引才能使用索引,不然不會使用索引建議大
家儘可能避免使用or,or的效率不高。
    d.若是列是字符串,查詢時,使用單引號引發可使用索引,不使用不會使用索引
    e.若是mysql發現掃描全表比使用索引快時,就不會使用索引。

8.如何查看索引使用的狀況
    show status 'handler_read%';
    值越高越好

9.經常使用sql優化
    a.group by 會對分組的數據作默認排序,當業務不須要排序時,能夠把order by null
    b.不少時候使用左鏈接比使用子查詢效率要高


10.存儲引擎選擇
    myisam存儲:對事務要求不高,同時是以查詢和添加爲主的。好比評論回覆表
    INNODB存儲:對事務要求高,保存數據重要。好比訂單表,帳號表
    Memory存儲:好比咱們數據變化頻繁,不須要入庫,同事有頻繁的查詢修改。


11.myisam和innodb的區別
                      myisam              innodb
    批量插入       高                        低
    事務安全      不支持                支持
    全文索引       支持                  (5.5以後)支持
    鎖機制          表鎖                    行鎖
    外鍵           不支持                   支持

 

12.碎片整理
    若是數據庫引擎是myisam的須要定時作碎片整理。
    例如:
    create table tableName (
        id int unsigned primary key auto_increment,
        name varchar(100) not null default '' 
    )engine=myisam charset utf8;

    insert into tableName values('aaa');

    delete from tableName where id = 1;

    使用delete語句並無真實刪除數據,在這種狀況下,咱們應該定時對myisam進行整理。
    命令:optimize table tableName;


題外話,技術就是窗戶紙,捅破了,就簡單了,因此要常常與大神交流,爲此,我辭職了……


13.數據庫備份
    a.手動備份
       cmd控制檯    mysqldump -u root -proot 數據庫[表名1,表名2……]  >文件路徑
        mysqldump -u root -proot temp >d:\temp.bak
        若是但願備份的是數據庫的某幾張表    

    b.自動備份
        把備份數據庫的指令寫入到bat文件裏,而後經過任務調度器定時調用bat文件


    c.使用備份文件恢復數據
        mysql 控制檯 source 備份文件路徑 例如 source d:\temp.dept.bak

    
14.mysql配置文件優化

    修改         a.端口號         b.最大鏈接數通常1000         c.innodb的緩存(通常擴大10倍)innodb_addition_mem_pool_size=64M     innodb_buffer_pool_size=1G,對於myisam,須要調整key_buffer_size。     

相關文章
相關標籤/搜索