常見的MySQL基本優化方法,由于對數據庫方面開發經驗較少,所以自己收集一些資料,這里主要是針對索引的一些基本操作。
show命令一些簡單用法
1、show status like 'uptime' mysql啟動的總時間
2、show status like 'com_select[delete,insert]'? 當前查詢連接數,刪除,添加
3、show status like 'connections' 連接數
4、show status like 'show_queries' 慢查詢次數
5、show variables like 'long_query_time' 當前慢查詢時間 默認是 10秒,超過10秒被認為是慢查詢
set long_query_time = 1 修改慢查詢時間,超過1秒被認為是慢查詢
慢查詢不只是針對查詢,添加也會被記錄
delimiter $? 作用:將mysql結束符';'換成自定義的符號 這里換成了 '$',一般在寫存儲過程的時候換成 '$',寫存儲過程會用到
關于慢日志
如果出現了慢查詢,這里如果查詢速度超過1秒,就會統計
如何將慢查詢的sql語句記錄到我們的日志中去,配置如下:
注意:在默認情況下,mysql是不記錄慢查詢,需要在啟動mysql時候指定記錄慢查詢
bin\mysqld.exe --safe-mode --slow-query-log [mysql5.5可以在my.ini指定]
bin\mysqld.exe -log-slow-queries=d:/abc.log [低版本mysql5.0可以在my.ini指定]
如果啟動了慢查詢日志,日志默認記錄到配置文件 datadir=目錄
索引優化
1、創建索引
1.1主鍵索引
create table aaa(id int unsigned primary key auto_increment,name varchar(32) not null default '');
id 為主鍵索引
如果創建表時,沒有指定主鍵索引,也可以在創建表后再添加:
alter table 表名 add primary key(列名)
例子:
create table bbb(
id int,
name varchar(32) not null default ''
);
添加主鍵 id
alter table bbb add primary key (id);
1.2普通索引
一般來說,先創建表再創建普通索引
例子:
create table ccc(
id int unsigned,
name varchar(32);
);
create index 索引名 on 表名 (列名)
1.3全文索引
使用場景:主要是針對文本的檢索,比如文章,全文索引只對MyISAM有效
例子:
create table articles(
id int unsigned primary key auto_increment,
title varchar(200) not null default '',
body text,
fulltext (title,body)
)engine=myisam charset utf8;
insert into articles (title,body) values
('mysql tutorial','DBMS stands for DataBase...'),
('How To Use MySQL Well','AFlter you went through a ...'),
('Optimizing MySQL','In this tutorial we will show ...'),
('1001 MySQL Tricks','1. Nerver run mysqld as root. 2. ...'),
('MySQL vs. YourSQL','In the following database comparison ...'),
('MySQL Security','When confiqured properly,MySQL ...');
使用全文索引:
錯誤用法:
select * from articles body like '%mysql%'; //不會使用全文索引
證明:
explain select * from articles where body like '%mysql%';
正確用法:
select * from articles where match(title,body) against('database');
說明:
1、再mysql中 fulltext索引只針對 myisam生效
2、mysql自己提供的fulltext只針對英文字母生效->sphinx(coreseek) 處理中文索引
3、使用方法 match(字段名,字段名...) against('關鍵字');
4、全文索引有一個叫停止詞,在一個文本中創建索引是一個無窮大的數,因此對一些常用的詞和字符,就不會去創建,這些詞成為,停止詞
1.4唯一索引
當表的某列被指定為unique約束時,那么這一列就是一個唯一索引
例子:
create table ddd(id int primary key auto_increment,name varchar(32) unique);
name列就是一個唯一索引
name列是否可以為空null 可以為空而且可以多個,其余的不能重復,包括''空字符串
主鍵字段,不可以為空null,并且不可以重復
先創建表,再指定唯一索引:
create table eee(id int primary key auto_increment, name varchar(32));
create unique index 索引名 on 表名 (列名);
2、查詢索引
Desc 表名 [缺點:不能夠查詢索引名]
show index(ex) from 表名
show keys from 表名? 和上面一樣
3、刪除索引
alter table 表名 drop index 索引名
刪除主鍵索引 alter table 表名 drop primary key;
4、索引使用注意事項:
索引付出代價,磁盤占用
對 增、刪、改 速度會變慢,因為要修改索引中的數據
哪些列適合添加索引:
較頻繁作為查詢條件
該字段內容有多個,不是唯一的幾個
字段內容更新不要太頻繁
比如,編號,id
不適合創建索引:
唯一性太差的字段,比如 性別字段,
更新頻率非常頻繁的字段
不會出現在where子句中的字段
使用索引:
1、對于創建的多列索引,只要查詢條件使用了最左邊的列,索引一般就會被使用
2、對于使用like的查詢,查詢如果是 '%aaa' 不會使用索引? 'aaa%'會使用索引
3、如果條件中有 or ,即使其中有條件帶索引也不會使用
4、對于多列索引,不是使用的第一部分,則不會使用索引
5、如果列類型是字符串,那一定要在條件中將數據使用引號引用起來,否則不使用索引。(添加時,字符串必然)
如何選擇mysql存儲引擎:
myisam: 如果表對事務(回滾)要求不高,同時是以查詢為主,考慮使用myisam
比如 bbs中的發帖表,回復表
查詢速度較快
支持全文索引
鎖表機制
不支持外鍵
InnoDB: 對事務要求高,保存的數據都是重要數據,我們建議使用InnoDB
比如 訂單表,賬戶表
查詢速度較慢
不支持全文索引
行鎖機制
支持外鍵
Memory: 比如我們數據變化非常頻繁,不需要入庫,同時頻繁查詢和修改,考慮使用Memory引擎