MySQL效能最佳化(一),MySQL效能最佳化(

來源:互聯網
上載者:User

MySQL效能最佳化(一),MySQL效能最佳化(

<pre name="code" class="sql">效能最佳化一共有6個點:    1.MySQL基礎操作    2.常用的SQL技巧    3.SQL語句最佳化    4.MySQL資料庫最佳化    5.Myisam表鎖    6.MySQL伺服器最佳化後期將逐步補全今天先分享下11.MySQL基礎操作一:MySQL基礎操作1:MySQL表複製複製表結構 + 複製表資料create table t3 like t1;  --建立一個和t1一樣的表,用like(表結構也一樣)insert into t3 select * from t1;  --t1的資料全部拿過來,注意是表結構一致才select* ,否則選擇相應的的欄位列插入create table t1(id int unsigned not null auto_increment primary key,name varchar(30));2:MySQL索引(create不能建立主鍵索引,得用alter,建議全部用alter建立索引)*設定主鍵後預設就是主鍵索引一:alter table用來建立普通索引,unique索引或primary key索引普通索引:alter table t1 add index in_name(name)   --t1表中的那麼欄位添加索引名為in_name唯一索引:alter table t1 add unique(name)   --不給名字,預設是欄位名  alter table t1 add unique un_name(name)  主鍵索引(自增才有意義):alter table t1 add primary key(id)         主鍵索引不是自增記得改成自增:alter table t1 modify id int unsigned not null auto_increment;查看:show index from t1;刪除:alter table t1 drop index in_name;@*刪除主鍵索引單獨處理*二:alter table table_name drop index index_namealter型刪除索引:alter table t1 drop index in_name;@*刪除主鍵索引*:注意:刪除主鍵索引的時候,如果你的主鍵索引是自增(如:id)刪除是會報錯的  實在想玩的話就把主鍵的auto_increment消掉  alter table t1 modify id int unsigned not null;  接著刪除主鍵:alter table t1 drop primary key;    改成自增:alter table t1 modify id int unsigned not null auto_increment;三:create index(不常用學習下,不能對主鍵索引操作,只能操作普通和唯一索引)   *建立普通索引:create index in_name on t1(name);  --將t1表中的那麼欄位添加為普通索引查看索引:     show index from t1;刪除索引:      drop index in_name on t1;    --t1表中的in_name索引刪除    ->在做唯一索引之前欄位不能有重複值,否則建立不成功   *建立唯一索引:  create unique index un_name on t1(name);四:刪除create建立的索引:drop indexdrop index in_name on t1;3:MySQL視圖定義:視圖是一個虛擬表,其內容由查詢定義,是根據建立視圖的sql語句拿到的資料儲存在一張表中而建立的表-視圖  *根據從表裡面拿出來的資料而建立出來的一張表建立視圖:create view v_t1 as select * from t1 where id>4 and id<11;  作用:  如果 t1表裡的資料某條記錄被刪除了,那麼視圖v_t1表的對應資料也會刪除,類似主從(主表無則從無)  所以:視圖也可以充當一個中間表:查資料的時候可以不去查主t1 去查視圖表v_t1  *視圖表示依賴於,建立時sql的表t_name,如果表t_name損壞的了(刪除了),對應的視圖將會發生錯誤不能使用 查看視圖:show tables;刪除視圖:drop view v_t1;視圖協助資訊:?view;4:MySQL內建函數字串函數:selectconcat("hello","word");        連結字串 ->hello worldlcase("MYSQL")    轉換成小寫ucase("mysql")    轉換成大寫length("leyangjun")          string長度ltrim("   userName")           去除前端空格rtrim("userName   ")           去除後端空格repeat("linux",count)       重複count次( select repeat('d',2);重複輸出2次dd)replace(str,search_str,replace_str)  在str中使用replace_str替換search_strsubstring(str,position[length])      從str的position開始,取length個字串->substring 和 substr一樣select substr("leyangjun",1,5);      從第一個開始取5個字串space(count)            產生count(數字)個空格數學函數bin(decimal_number)         十進位轉二進位(select bin(120);)ceiling(number2)            向上取整(select ceiling(10.10);--->11)floor(number2)            向下取整(select ceiling(10.10);--->10)Max(列)              取最大值MIN(列)              取最小值sqrt(number2)               開平方rand()                      返回0-1內的隨機值日期函數:curdate();       返回當前日期curtime();       返回目前時間now();           返回當前的日期和時間unix_timestamp(date)   返回date的unix時間戳記from_unixtime()        返回unix時間戳記日期值week(date)             返回日期date為一年中的第幾周year(date)             返回日期中的年份datediff(expr,expr2)   返回起始時間expr和結束時間expr2間隔天數select datediff("2014-08-03","2014-08-04");5:MySQL預先處理語句一:設定一個預先處理語句:prepare stmt1 from 'select * from t1 where id>?';二:設定一個變數:set @=i1;三:執行stmt1預先處理:execute stmt1 using @i;設定@i=5set @i=5;execute stmt1 using @i;刪除預先處理:drop prepare stmt1;應用情境:比如你是老闆我要看1,2,3,4,5,6、、、、12月份入職人員的情況  *就可以把SQL做成預先處理,這樣就不需要每次去請求MySQL直接傳個值就可以(MySQL是將預先處理的SQL儲存起來,用的時候傳值直接就執行,就不需要每次請求串連MySQL在重新執行)6:MySQL交易處理(增刪改查後只要沒有commit,全可以復原)    *myisam引擎不支援事務,innodb(支援外鍵和事務)才支援事務修改表引擎方法:alter table t1 engine=innodb一:事務操作查看是否自動認可:select @@autocommit;關閉自動認可set autocommit=0;delete from t1 where id>5;  資料只是臨時刪除,如果commit就真正的執行刪除語句rollback;     只要沒commit還原剛才刪除的資料commit;二:還原點的使用:insert into t1 values("user4");savepoint p1;insert into t1 values("user5");savepoint p2;insert into t1 values("user6");savepoint p3;--3個資料已經插進去啦,能後你覺得user6不要,你就找到還原點 savepoint p2就行rollback to p2;    --還原到P2  user6不要commit;7:MySQL儲存(可以認為是自訂的函數)建立一個儲存:\d //create procedure p1()beginset @i=0;while @i<10 doinsert into t2(name) values(concat("user",@i));        --這裡可以做增刪改查。。。都行set @i=@i+1;end while;end;//執行一個儲存:\d ;call p1();查看儲存:show procedure status;show create procedure p1\G   --查看p1儲存的基本資料8:MySQL觸發器(自動執行)*查詢沒有必要做觸發器!:select * from t1 union select * from t2;一:增加觸發器\d //建立一個名字為tg1的觸發器,當向表中插入資料時,就向t2表中插入一條資料create trigger tg1 before insert on t1 for each rowbegininsert into t2(id) values(new.id);    --new.id 比如向t1表裡面插入了id=4的    能後new.id=4 直接複製到這end//準備好t1 表 和 t1表向t1表中插入多條資料查看:show triggers;刪除觸發器:drop trigger t2;二:刪除觸發器(注意下:刪除的時候2個表的值一定要對稱,比如t1:1,2,3 t2:11,12,13這麼刪除是不行會報錯,以一定要對稱比如t1和t2表都有user1,這樣刪除就是沒問題 )\d //create trigger tg2 before delete on t1 for each rowbegin delete from t2 where id=old.id;   --插入的時候裡面沒有這個值叫new.id  提前有的值叫old.idend//三:更改觸發器:create trigger tg3 before update on t1 for each rowbegin update t2 set id=new.id where old.id;  --(update t1 set name="leyangjun"-new.id where name="zhangfei"-old.id)end//9:重排auto_increment值MySQL資料庫自動成長的ID如何恢複:清空表的時候,不能用delete from tableName;  而是用truncate tableName;這樣auto_increment就恢複成1了或者清空內容後直接用alter命令修改表:alter table tableName auto_increment=1;情境:1:t1表裡面有id欄位分別對應 1,2,3,4,5,6,7,8,9的記錄,    2:能後我們delete刪除,能後在插入資料,你會發現插入的時候是從10,11,12,13.....開始而不是13:清空的時候我們執行下這個歸檔為1即可:alter table tableName auto_increment=1;4:能後在插入的時候就是從1開始的啦




mysql性可以最佳化,歡迎

你給的資訊基本沒用,你沒說你資料庫的應用類型,以及你運營環境

設定檔基本不用改動,具體問題具體微調,他不會對資料庫最佳化起明顯作用

最佳化一般分一下幾個:
1.儲存引擎的選擇。高並發,update,insert較多、切需要交易處理適用 innodb;select為主用myisam;通常所有的表會使用相同的引擎,便於維護
2.根據資料量、cpu、記憶體、磁碟i/o開銷可以選擇分表、分庫、主從負載
3.最關鍵的就是sql和索引了,配合適當的索引,寫出高效的sql是最佳化的基本

最佳化是一個調試的過程,沒有1個通用的模式,要從實際情況作合理選擇
 
MySQL資料庫性可以最佳化有什技巧?

1.儲存引擎的選擇如果資料表需要交易處理,應該考慮使用InnoDB,因為它完全符合ACID特性。如果不需要交易處理,使用預設儲存引擎MyISAM是比較明智的。並且不要嘗試同時使用這兩個儲存引擎。思考一下:在一個交易處理中,一些資料表使用InnoDB,而其餘的使用MyISAM.結果呢?整個subject將被取消,只有那些在交易處理中的被帶回到原始狀態,其餘的被提交的資料轉存,這將導致整個資料庫的衝突。然而存在一個簡單的方法可以同時利用兩個儲存引擎的優勢。目前大多數MySQL套件中包括InnoDB、編譯器和鏈表,但如果你選擇MyISAM,你仍然可以單獨下載InnoDB,並把它作為一個外掛程式。很簡單的方法,不是嗎?
2.計數問題如果資料表採用的儲存引擎支援交易處理(如InnoDB),你就不應使用COUNT(*)計算資料表中的行數。這是因為在產品類資料庫使用COUNT(*),最多返回一個近似值,因為在某個特定時間,總有一些交易處理正在運行。如果使用COUNT(*)顯然會產生bug,出現這種錯誤結果。
3.反覆測試查詢查詢最棘手的問題並不是無論怎樣小心總會出現錯誤,並導致bug出現。恰恰相反,問題是在大多數情況下bug出現時,應用程式或資料庫已經上線。的確不存在針對該問題切實可行的解決方案,除非將測試樣本在應用程式或資料庫上運行。任何資料庫查詢只有經過上千個記錄的大量樣本測試,才能被認可。
4.避免全表掃描通常情況下,如果MySQL(或者其他關聯式資料庫模型)需要在資料表中搜尋或掃描任意特定記錄時,就會用到全表掃描。此外,通常最簡單的方法是使用索引表,以解決全表掃描引起的低效能問題。然而,正如我們在隨後的問題中看到的,這存在錯誤部分。
5.使用“EXPLAIN”進行查詢當需要調試時,EXPLAIN是一個很好的命令,下面將對EXPLAIN進行深入探討。
參考資料:hi.baidu.com/...3.html
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.