MySQL數據庫優化詳解。本站提示廣大學習愛好者:(MySQL數據庫優化詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL數據庫優化詳解正文
mysql表復制
復制表構造+復制表數據
mysql> create table t3 like t1; mysql> insert into t3 select * from t1;
mysql索引
ALTER TABLE用來創立通俗索引、UNIQUE索引或PRIMARY KEY索引 ALTER TABLE table_name ADD INDEX index_name (column_list) ALTER TABLE table_name ADD UNIQUE (column_list) ALTER TABLE table_name ADDPRIMARY KEY (column_list) Create Index CREATE INDEX index_name ON table_name (column_list) CREATE UNIQUE INDEX index_name ON table_name (column_list) drop index DROP INDEX index_name ON talbe_name alter table table drop ALTER TABLE table_name DROP INDEX index_name ALTER TABLE table_name DROP PRIMARY KEY
mysql視圖
創立視圖
mysql> create view v_t1 as select * from t1 where id>4 and id<11; Query OK, 0 rows affected (0.00 sec)
view視圖的贊助信息
mysql> ? view ALTER VIEW CREATE VIEW DROP VIEW
檢查視圖
mysql> show tables;
刪除視圖v_t1
mysql> drop view v_t1;
mysql內置函數
字符串函數
CONCAT (string2 [,… ]) //銜接字串 LCASE (string2 ) //轉換成小寫 UCASE (string2 ) //轉換成年夜寫 LENGTH (string ) //string長度 LTRIM (string2 ) //去除前端空格 RTRIM (string2 ) //去除後端空格 REPEAT (string2 ,count ) //反復count次 REPLACE (str ,search_str ,replace_str ) //在str頂用replace_str調換search_str SUBSTRING (str , position [,length ]) //從str的position開端,取length個字符 SPACE(count) //生成count個空格
數學函數
BIN (decimal_number ) //十進制轉二進制 CEILING (number2 ) //向上取整 FLOOR (number2 ) //向下取整 MAX(num1 ,num2) //取最年夜值 MIN(num1,num2) //取最小值 SQRT(number2) //開平方 RAND() //前往0-1內的隨機值
日期函數
CURDATE() //前往以後日期 CURTIME() //前往以後時光 NOW() //前往以後的日期時光 UNIX_TIMESTAMP(date) //前往以後date的UNIX日間戳 FROM_UNIXTIME() //前往UNIX時光戳的日期值 WEEK(date) //前往日期date為一年中的第幾周 YEAR(date) //前往日期date的年份 DATEDIFF(expr,expr2) //前往肇端時光expr和停止時光expr2間天數
mysql預處置語句
設置stmt1預處置,傳遞一個數據作為一個where斷定前提
mysql> prepare stmt1 from 'select * from t1 where id>?';
設置一個變量
mysql> set @i=1;
履行stmt1預處置
mysql> execute stmt1 using @i;
設置@i為5
mysql> set @i=5;
再次去履行stmt1
mysql> execute stmt1 using @i;
若何刪除預處置stmt1
mysql> drop prepare stmt1;
mysql事務處置
--封閉主動提交功效 mysql> set autocommit=0; --從表t1中刪除一筆記錄 mysql> delete from t1 where id=11; --此時做一個p1復原點: mysql> savepoint p1; --再次從表t1中刪除一筆記錄: mysql> delete from t1 where id=10; --再次做一個p2復原點: mysql> savepoint p2; --此時恢復到p1復原點,固然前面的p2這些復原點主動會掉效: mysql> rollback to p1; --退回到最原始的復原點: mysql> rollback ;
mysql存儲
創立一個存儲p1()
mysql> \d // mysql> create procedure p1() -> begin -> set @i=0; -> while @i<10 do -> select @i; -> set @i=@i+1; -> end while; -> end; -> //
履行存儲p1()
mysql> \d ; mysql> call p1(); --檢查procedure p1()的status信息 mysql> show procedure status\G --檢查procedure p1()的詳細信息: mysql> show create procedure p1\G
mysql觸發器
修正delimiter為// mysql> \d // 創立一個名字為tg1的觸發器,當向t1表中拔出數據時,就向t2表中拔出一條數據 mysql> create trigger tg1 before insert on t1 for each ro >begin >insert into t2(id) values(new.id); >end// --預備兩個空表t1和t2 mysql> select * from t1; mysql> select * from t2; --向t1表中拔出多條數據: mysql> insert into t1 values(1),(2),(3),(4); 若何制造刪除表t1後t2表中的記載也會隨著刪除呢 mysql>\d // mysql> create trigger tg2 beforedelete on t1 for each row >begin delete from t2 where id=old.id; >end// mysql>\d ; 若何制造更改表t1後t2表中的記載隨著特性呢 mysql>\d // mysql> create trigger tg3 beforeupdate on t1 for each row >begin update t2 set id=new.id where id=old.id; >end// mysql>\d ; 檢查觸發器 mysql> show triggers;
重排auto_increment值
MYSQL數據庫主動增加的ID若何恢復,清空表的時刻。不克不及用 delete from tablename; 而是要用: truncatetable tablename; 如許auto_increment 就恢復成1了 或許清空內容後直接用ALTER敕令修正表: altertable tablename auto_increment =1;
應用GROUP BY的WITH ROLLUP
mysql> select * from demo; +-------+-------+ | cname | pname | +-------+-------+ | bj | hd | | bj | xc | | bj | hd | | sh | dh | | sh | rg | | sh | dh | +-------+-------+ 9 rows in set (0.00 sec)
對demo表依照cname、pname列分組對pname列停止聚算計算以下
mysql> select cname,pname,count(pname) from demo group by cname,pname; +-------+-------+--------------+ | cname | pname | count(pname) | +-------+-------+--------------+ | bj | hd | 3 | | bj | xc | 2 | | sh | dh | 3 | | sh | rg | 1 | +-------+-------+--------------+ 4 rows in set (0.00 sec)
異樣應用with rollup症結字後,統計出更多的信息,以下。留意:with rollup弗成以和ordery by同時應用
ysql> select cname,pname,count(pname) from demo group by cname,pname with rollup; +-------+-------+--------------+ | cname | pname | count(pname) | +-------+-------+--------------+ | bj | hd | 3 | | bj | xc | 2 | | bj | NULL | 5 | | sh | dh | 3 | | sh | rg | 1 | | sh | NULL | 4 | | NULL | NULL | 9 | +-------+-------+--------------+ 7 rows in set (0.00 sec)
應用外鍵須要留意的成績
創立外鍵的方法
mysql>create table temp( id int, name char(20), foreign key(id) references outTable(id) on delete cascade on update cascade);
留意:Innodb類型的表支撐外鍵,myisam類型的表,固然創立外鍵可以勝利,然則不起感化,重要緣由是不支撐外鍵。
優化SQL語句的普通步調
經由過程show status敕令懂得各類SQL的履行頻率
mysql> show [session|global]status;
個中:session(默許)表現以後銜接,global表現自數據庫啟動至今
mysql>show status; mysql>show global status; mysql>show status like ‘Com_%'; mysql>show global status like ‘Com_%';
參數解釋:
Com_XXX表現每一個XXX語句履行的次數如:
Com_select 履行select操作的次數,一次查詢只累計加1
Com_update 履行update操作的次數
Com_insert 履行insert操作的次數,對批量拔出只算一次。
Com_delete 履行delete操作的次數
只針關於InnoDB存儲引擎的:
InnoDB_rows_read 履行select操作的次數
InnoDB_rows_updated 履行update操作的次數
InnoDB_rows_inserted 履行insert操作的次數
InnoDB_rows_deleted 履行delete操作的次數
其他:
connections 銜接mysql的數目
Uptime 辦事器曾經任務的秒數
Slow_queries:慢查詢的次數
定位履行效力較低的SQL語句
explain select * from table where id=1000; desc select * from table where id=1000;
經由過程EXPLAIN剖析較低效SQL的履行籌劃
mysql> explain select count(*) from stu where name like "a%"\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: stu type: range possible_keys: name,ind_stu_name key: name key_len: 50 ref: NULL rows: 8 Extra: Using where; Using index 1 row in set (0.00 sec)
每列的簡略說明
id: 1
select_type: SIMPLE 表現select的類型,罕見的取值有SIMPLE()簡略表,即不應用表銜接或許子查詢)、PRIMARY(主查詢,即外層的查詢)、UNION(UNION中的第二個或許前面的查詢語句)、SUBQUERY(子查詢中的第一個SESECT)等
table: stu 輸入成果集的表
type: range 表現表的銜接類型,機能有好赴任:system(表僅一行)、const(只一行婚配)、eq_ref(關於後面的每行應用主鍵和獨一)、ref(同eq_ref,但沒有應用主鍵和獨一)、ref_or_null(同後面對null查詢)、index_merge(索引歸並優化)、unique_subquery(主鍵子查詢)、index_subquery(非主鍵子查詢)、range(表單中的規模查詢)、index(都經由過程查詢索引來獲得數據)、all(經由過程全表掃描獲得的數據)
possible_keys: name,ind_stu_name 表查詢時能夠應用的索引。
key: name 表現現實應用的索引。
key_len: 50 索引字段的長度
ref: NULL
rows: 8 掃描行的數目
Extra: Using where; Using index 履行情形的解釋和描寫
索引成績
MyISAM存儲引擎的表的數據和索引是主動離開存儲的,各自是唯一的一個文件;InnoDB存儲引擎的表的數據和索引是存儲在統一個表空間外面,但可以有多個文件構成。MySQL今朝不支撐函數索引,然則能對列的後面某一部門停止索引,例如name字段,可以只取name的前4個字符停止索引,這個特征可以年夜年夜減少索引文件的年夜小,用戶在設計表構造的時刻也能夠對文本列依據此特征停止靈巧設計。
mysql>create index ind_company2_name on company2(name(4));
--個中company表名ind_company2_name索引名
MySQL若何應用索引
1、應用索引
(1)關於創立的多列索引,只需查詢的前提頂用到最右邊的列,索引普通就會被應用。以下創立一個復合索引。
mysql>create index ind_sales2_com_mon on sales2(company_id,moneys);
然後按company_id停止查詢,發明應用到了復合索引
mysql>explain select * from sales2 where company_id=2006\G
應用上面的查詢就沒有應用到復合索引。
mysql>explain select * from sales2 where moneys=1\G
(2) 應用like的查詢,前面假如是常量而且只要%號不在第一個字符,索引才能夠會被應用,以下:
mysql> explain select * from company2 where name like "%3"\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: company2 type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 1000 Extra: Using where 1 row in set (0.00 sec)
以下這個應用到了索引,而上面例子可以或許應用索引,差別就在於“%”的地位分歧,下面的例子是吧“%”放在了第一名,而上面的例子則沒有
mysql> explain select * from company2 where name like "3%"\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: company2 type: range possible_keys: ind_company2_name key: ind_company2_name key_len: 11 ref: NULL rows: 103 Extra: Using where 1 row in set (0.00 sec)
(3)假如對年夜的文本停止搜刮,應用全文索引而不應用like“%...%”.
(4)假如列名是索引,應用column_name is null將應用索引。以下
mysql> explain select * from company2 where name is null\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: company2 type: ref possible_keys: ind_company2_name key: ind_company2_name key_len: 11 ref: const rows: 1 Extra: Using where 1 row in set (0.00 sec)
存在索引但不應用索引
(1)假如MySQL估量應用索引比全表掃描更慢,則不應用索引。例如假如列key_part1平均散布在1到100之間,查詢時應用索引就不是很好
mysql>select * from table_name where key_part1>1 and key_part<90;
(2)假如應用MEMORY/HEAP表而且where前提中不應用“=”停止索引列,那末不會用到索引。Heap表只要在“=”的前提下會應用索引。
(3)用or朋分開的前提,假如or前的前提中的列有索引,爾後面的列中沒有索引,那末觸及的索引都不會被用到。
mysql>show index from sales\G *************************** 1. row *************************** …… key_name: ind_sales_year seq_in_index:1 Column_name: year ……
從下面可以發明只要year列下面有索引。來看以下的履行籌劃。
mysql> explain select * from sales where year=2001 or country=‘China'\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: sales type: ALL possible_keys: ind_sales_year key: NULL key_len: NULL ref: NULL rows: 12 Extra: Using where 1 row in set (0.00 sec)
(4)假如不是索引列的第一部門,以下例子:可見固然在money下面建有復合索引,然則因為money不是索引的第一列,那末在查詢中這個索引也不會被MySQL采取。
mysql> explain select * from sales2 where moneys=1 \G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: sales2 type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 1000 Extra: Using where 1 row in set (0.00 sec)
(5)假如like是以%開端,可見固然在name下面建有索引,然則因為where 前提中like的值的“%”在第一名了,那末MySQL也會采取這個索引。
(6)假如列類型是字符串,但在查詢時把一個數值型常量賦值給了一個字符型的列名name,那末固然在name列上有索引,然則也沒有效到。
mysql> explain select * from company2 where name name=294\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: company2 type: ALL possible_keys: ind_company2_name key: NULL key_len: NULL ref: NULL rows: 1000 Extra: Using where 1 row in set (0.00 sec)
而上面的sql語句便可以准確應用索引。
mysql> explain select * from company2 where name name=‘294'\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: company2 type: ref possible_keys: ind_company2_name key: ind_company2_name key_len: 23 ref: const rows: 1 Extra: Using where 1 row in set (0.00 sec)
檢查索引應用情形
假如索引正在任務,Handler_read_key的值將很高,這個值代表了一個行被索引值讀的次數。
Handler_read_rnd_next的值高則意味著查詢運轉低效,而且應當樹立索引解救。
mysql> show status like 'Handler_read%'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | Handler_read_first | 0 | | Handler_read_key | 5 | | Handler_read_next | 0 | | Handler_read_prev | 0 | | Handler_read_rnd | 0 | | Handler_read_rnd_next | 2055 | +-----------------------+-------+ 6 rows in set (0.00 sec)
兩個簡略適用的優化辦法
剖析表的語法以下:(檢討一個或多個表能否有毛病)
mysql> CHECK TABLE tbl_name[,tbl_name] …[option] …option = { QUICK | FAST | MEDIUM| EXTENDED | CHANGED} mysql> check table sales; +--------------+-------+----------+----------+ | Table | Op | Msg_type | Msg_text | +--------------+-------+----------+----------+ | sakila.sales | check | status | OK | +--------------+-------+----------+----------+ 1 row in set (0.01 sec)
優化表的語法格局:
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [,tbl_name]
假如曾經刪除表的一年夜部門,或許假如曾經對含有可變長度行的表停止了許多的修改,則須要做按期優化。這個敕令可以將表中的空間碎片停止歸並,然則此敕令只對MyISAM、BDB和InnoDB表起感化。
mysql> optimize table sales; +--------------+----------+----------+----------+ | Table | Op | Msg_type | Msg_text | +--------------+----------+----------+----------+ | sakila.sales | optimize | status | OK | +--------------+----------+----------+----------+ 1 row in set (0.05 sec)
經常使用SQL的優化
年夜批量拔出數據
當用load敕令導入數據的時刻,恰當設置可以進步導入的速度。
關於MyISAM存儲引擎的表,可以經由過程以下方法疾速的導入年夜量的數據。
ALTER TABLE tbl_name DISABLE KEYS
loading the data
ALTER TABLE tbl_name ENABLE KEYS
DISABLE KEYS 和ENABLE KEYS 用來翻開或封閉MyISAM表非獨一索引的更新,可以進步速度,留意:對InnoDB表有效。
--沒有應用翻開或封閉MyISAM表非獨一索引:
mysql> load data infile ‘/home/mysql/film_test.txt'into table film_test2; Query OK,529056 rows affected (1 min 55.12 sec) Records:529056 Deleted:0 Skipped:0 Warnings:0
--應用翻開或封閉MyISAM表非獨一索引:
mysql> alter table film_test2 disable keys; Query OK,0 rows affected (0.0 sec) mysql> load data infile ‘/home/mysql/film_test.txt'into table film_test2; Query OK,529056 rows affected (6.34 sec) Records:529056 Deleted:0 Skipped:0 Warnings:0 mysql> alter table film_test2 enable keys; Query OK,0 rows affected (12.25 sec)
--以上對MyISAM表的數據導入,但關於InnoDB表其實不能進步導入數據的效力
(1)針關於InnoDB類型表數據導入的優化
由於InnoDB表的依照主鍵次序保留的,所以將導入的數據主鍵的次序分列,可以有用地進步導入數據的效力。
--應用test3.txt文本是按表film_test4主鍵存儲次序保留的
mysql> load data infile ‘/home/mysql/film_test3.txt'into table film_test4; Query OK, 1587168 rows affected (22.92 sec)
Records:1587168 Deleted:0 Skipped:0 Warnings:0
--應用test3.txt沒有任何次序的文本(效力慢了1.12倍)
mysql> load data infile ‘/home/mysql/film_test4.txt'into table film_test4; Query OK, 1587168 rows affected (31.16 sec) Records:1587168 Deleted:0 Skipped:0 Warnings:0
(2)封閉獨一性效驗可以進步導入效力
在導入數據前先履行set unique_checks=0,封閉獨一性效驗,在導入停止後履行set unique_checks=1,恢復獨一性效驗,可以進步導入效力。
--當unique_checks=1時
mysql> load data infile ‘/home/mysql/film_test3.txt'into table film_test4; Query OK,1587168 rows affected (22.92 sec) Records:1587168 Deleted:0 Skipped:0 Warnings:0
--當unique_checks=0時
mysql> load data infile ‘/home/mysql/film_test3.txt'into table film_test4; Query OK,1587168 rows affected (19.92 sec) Records:1587168 Deleted:0 Skipped:0 Warnings:0
(3)封閉主動提交可以進步導入效力
在導入數據前先履行set autocommit=0,封閉主動提交事務,在導入停止後履行set autocommit=1,恢復主動提交,可以進步導入效力。
--當autocommit=1時
mysql> load data infile ‘/home/mysql/film_test3.txt'into table film_test4; Query OK,1587168 rows affected (22.92 sec) Records:1587168 Deleted:0 Skipped:0 Warnings:0
--當autocommit=0時
mysql> load data infile ‘/home/mysql/film_test3.txt'into table film_test4; Query OK,1587168 rows affected (20.87 sec) Records:1587168 Deleted:0 Skipped:0 Warnings:0
優化insert語句
盡可能應用多個值表的insert語句,如許可以年夜年夜延長客戶與數據庫的銜接、封閉等消耗。
可使用insert delayed(立時履行)語句獲得更高的效力。
將索引文件和數據文件分離寄存分歧的磁盤上。
可以增長bulk_insert_buffer_size 變量值的辦法來進步速度,然則只對MyISAM表應用當從一個文件中裝載一個表時,應用LOAD DATA INFILE。這個平日比應用許多insert語句要快20倍。
優化group by語句
假如查詢包括group by但用戶想要防止排序成果的消耗,則可使用應用order by null來制止排序:
以下沒有應用order by null來制止排序
mysql> explain select id,sum(moneys) from sales2 group by id\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: sales2 type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 1000 Extra: Using temporary;Using filesort 1 row in set (0.00 sec)
以下應用order by null的後果:
mysql> explain select id,sum(moneys) from sales2 group by id order by null\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: sales2 type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 1000 Extra: Using temporary 1 row in set (0.00 sec)
優化嵌套查詢
上面是采取嵌套查詢的後果(可使用更有用的鏈接查詢(Join)替換)。
mysql> explain select * from sales2 where company_id not in(select id from company2)\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: sales2 type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 1000 Extra: Using where 1 row in set (0.00 sec) *************************** 2. row *************************** id: 2 select_type: SIMPLE table: company2 type: index_subquery possible_keys: ind_company2_id key: ind_company2_id key_len: 5 ref: func rows: 2 Extra: Using index 1 row in set (0.00 sec)
上面是應用更有用的鏈接查詢(Join)
mysql> explain select * from sales2 left join company2 on sales2.company_id = company2.id where sales2.company_id is null\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: sales2 type: ALL possible_keys: ind_sales2_companyid_moneys key: ind_sales2_companyid_moneys key_len: 5 ref: count rows: 1 Extra: Using where 1 row in set (0.00 sec) *************************** 2. row *************************** id: 2 select_type: SIMPLE table: company2 type: index_subquery possible_keys: ind_company2_id key: ind_company2_id key_len: 5 ref: func rows: 1 Extra: 1 row in set (0.00 sec)
從履行籌劃中可以顯著看出查詢掃描的記載規模和應用索引的情形都有了很年夜的改良。銜接(JOIN)子所以更有用率一些,是由於MySQL不須要再內存中創立暫時表來完成這個邏輯上的須要兩個步調的查詢任務。
數據庫優化
優化表的類型
在MySQL中,可使用函數PROCEDUREANALYSE()對以後運用的表停止剖析,改函數可以對數據表中列的數據類型提出優化建議,用戶可以依據運用的現實情形酌情斟酌能否實行優化。
mysql> select * from duck_cust procedure analyse()\G *************************** 1. row *************************** Field_name: sakila.duch_cust.cust_num Min_value: 1 Max_value: 6 Min_length: 1 Max_length: 1 Empties_or_zeros: 0 Nulls: 0 Avg_value_or_avg_length: 3.5000 Std: 1.7078 Optimal_fieldtype: ENUM(‘1',‘2',‘3',‘4') NOT NULL *************************** 2. row *************************** ……
年夜存儲量處理
1.分庫分表
2.分區
重要目標:
1.削減表的記載數
2.減小對操作體系的累贅壓力
中央表
中央表的發生:
1.view 視圖
2.從新生成一個新表
Mysql辦事器優化
myisam讀鎖定
1.
lock table t1 read
2.開啟另外一個mysql銜接終端,接著去測驗考試:
select * from t1
3.再insert、update和delete t1這張表,你會發明一切的數據都逗留在終端上沒有真實的去操作
4.讀鎖定對我們在做備份年夜量數據時異常有效.
mysqldump -uroot -p123 test >test.sql
myisam寫鎖定
1.
lock table t1 write
2.翻開另外一個mysql終端,測驗考試去select、insert、update和delete這張表t1,你會發明都不克不及操作,都邑逗留在終端上,只要等第一個終端操作終了,第二個終端能力真正履行.
3.可見表的寫鎖定比讀鎖定更嚴厲
4.普通情形下我們很少去顯式的去對表停止read 和write鎖定的,myisam會主動停止鎖定的.
Mysql辦事器優化
二進制日記
1.log-bin=mysql-bin
檢查bin-log日記:
mysql> show binary logs;
檢查最初一個bin-log日記:
mysql> show master status;
慢查詢日記
開戶和設置慢查詢時光:
vi /etc/my.cnf
log_slow_queries=slow.log
long_query_time=5
慢查詢次數:
mysql> show global status like "%quer%"
socket成績
mysql socket沒法登錄
1. 有時登錄mysql時提醒不克不及用socket登錄,此時可以換成tcp方法去登錄,然則可以測試時可以如許用,然則必需要在php去用之前把這個工作處理了.
[root@localhost mysql]# mysql -uroot -pwei --protocol tcp -hlocalhost Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 34 Server version: 5.0.77-log Source distribution Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql>
如許便可以登錄,如許就不消mysql.sock來登錄,而mysql.sock是啟動mysqld辦事時發生的
root暗碼喪失
root暗碼喪失破解
1.service mysqld stop 2. mysqld_safe --skip-grant-tables --user=mysql & //跳過受權表mysql.user和mysql.db這些表 3. mysql -uroot 4. set password=password("wei"); //用這一條語句成果報錯,就是由於加了--skip-grant-tables 4. mysql>update user set password=password("wei") where user='root' and host='localhost'; 5. mysql> set password for root@localhost=password("wei"); 6. mysql> set password=password("wei"); //和第五步一樣,都能夠勝利修正暗碼