使用 showstatus 可以參考到mysql的各個參數,我們需要掌握的是以下參數, 其它請參考手冊.
比如 com_select com_update com_insert com_delete , 比如我們在選擇表究竟時候用MyISAM 還是 InnoDB , 可以看看該網站是以讀和寫操作爲主,則可以使用MyISAM.
☞這裏注意當我們使用 showstatus 來查詢參數時,默認是當前會話.
show session status like xxxx
如果你要查看從數據庫啓動到現在狀態
show global status like xxx
show status like ‘connections’ 可以查看當前連接的數量.
表示數據庫啓動時間
show status like ‘slow_queries’
顯示慢查詢次數, 默認情況下mysql認爲慢查詢時間是10s
我們使用兩個方法,蠕蟲複製,可以構建大表,但是測試效果不好.
使用存儲過程來創建海量表
模擬一個僱員管理系統
#模擬一個僱員管理系統
CREATE TABLE dept( /*部門表*/
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
dname VARCHAR(20) NOT NULL DEFAULT "",
loc VARCHAR(13) NOT NULL DEFAULT ""
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
#創建表EMP僱員
CREATE TABLE emp
(empno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, /*編號*/
ename VARCHAR(20) NOT NULL DEFAULT "", /*名字*/
job VARCHAR(9) NOT NULL DEFAULT "",/*工作*/
mgr MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,/*上級編號*/
hiredate DATE NOT NULL,/*入職時間*/
sal DECIMAL(7,2) NOT NULL,/*薪水*/
comm DECIMAL(7,2) NOT NULL,/*紅利*/
deptno MEDIUMINT UNSIGNED NOT NULLDEFAULT 0 /*部門編號*/
)ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
CREATE TABLE salgrade
(
grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
losal DECIMAL(17,2) NOT NULL,
hisal DECIMAL(17,2) NOT NULL
)ENGINE=MyISAM DEFAULT CHARSET=utf8;
#測試數據
INSERT INTO salgrade VALUES (1,700,1200);
INSERT INTO salgrade VALUES (2,1201,1400);
INSERT INTO salgrade VALUES (3,1401,2000);
INSERT INTO salgrade VALUES (4,2001,3000);
INSERT INTO salgrade VALUES (5,3001,9999);
delimiter $$
#創建一個函數,可以返回一個隨機的字符串
create function rand_string(n INT)
returns varchar(255) #該函數會返回一個字符串
begin
#定義了一個變量 chars_str,類型 varchar(100)
#默認給 chars_str 初始值 'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ'
declare chars_str varchar(100)default
'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';
declare return_str varchar(255)default '';
declare i int default 0;
while i < n do
set return_str=concat(return_str,substring(chars_str,floor(1+rand()*52),1));
set i = i + 1;
end while;
return return_str;
end $$
#這裏我們又自定了一個函數,返回一個隨機的部門號
create function rand_num( )
returns int(5)
begin
declare i int default 0;
set i = floor(10+rand()*500);
return i;
end $$
#隨即添加僱員[光標] 400w,Mysql開發中,可以在存儲過程中調用你自己
#編寫的函數
create procedure insert_emp(in start int(10),in max_num int(10))
begin
declare i int default 0;
#set autocommit =0 把autocommit設置成0
#autocommit = 0 含義: 不要自動提交
set autocommit = 0;
repeat
set i = i + 1;
insert into emp values ((start+i),rand_string(6),'SALESMAN',0001,curdate(),2000,400,rand_num());
until i = max_num
end repeat;
commit;
end $$
調用存儲過程添加400w數據
call insert_emp(100001,4000000);
步驟
①在默認情況下,mysql是不會記錄慢查詢, 所以我們要使用另外一種方式啓動mysql,指令: cmd>bin\mysqld.exe – safe-mode –slow-query-log
這樣就會在mysql 的 data目錄,生成一個日誌文件,該文件可以把慢查詢語句記錄到文件.
②爲了測試我們修改默認的慢查詢時間
show variables like ‘long_query_time’ 【查詢當前慢查詢時間】
set long_query_time=1
③當執行一個時間超過1秒的sql語句,就會被記錄下來.
# Query_time: 1.500000 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 4000000
use temp100;
SET timestamp=1371870578;
select * from emp whereempno=456784;
④分析慢查詢時如何導致explain 工具
基本語法: explain sql \G
可以來分析mysql是如何執行你的sql語句
☞細緻的說明請參考優化.ppt
⑤解決問題: 我們發現目前這個語句沒有使用到索引,因此我們先考慮使用索引解決.
創建普通索引: CREATE INDEX 索引名 ON 表名(列)
⑥看看此時速度怎樣
圖:
①當一個表的存儲引擎是MyISAM 時,對應三個文件
表名.frm 【表的結構】
表名.myd 【表的數據】
表名.myi 【索引的數據】