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。