mysql用法總結及整理php
SELECT user_id, count(*) as total FROM `blog_index_tbl` WHERE add_time BETWEEN UNIX_TIMESTAMP('2016-01-01 00:00:00') AND UNIX_TIMESTAMP('2016-12-31 23:59:59') GROUP BY user_id HAVING total > 1 ORDER BY total DESC;
最近研發的項目對DB依賴比較重,梳理了這段時間使用MySQL遇到的8個比較具備表明性的問題,答案也比較偏本身的開發實踐,沒有DBA專業和深刻,有出入的請使勁拍磚!...html
MySQL讀寫性能是多少,有哪些性能相關的配置參數?mysql
MySQL負載高時,如何找到是由哪些SQL引發的?sql
如何針對具體的SQL作優化?數據庫
SQL層面已難以優化,請求量繼續增大時的應對策略?性能
MySQL如何作主從數據同步?優化
如何防止DB誤操做和作好容災?this
該選擇MySQL哪一種存儲引擎,Innodb具備什麼特性?spa
MySQL內部結構有哪些層次?.net
複製表結構+複製表數據
mysql> create table t3 like t1; mysql> INSERT INTO t3 SELECT * t1;
注意:若是須要把表中的某一個字段拷貝到另外一個表中對應的字段處,就可使用相應的字段。
MyIsam
引擎不支持事務處理,必須使用 innoDB
而後進行 commit
命令提交,數據才能被真正刪除,不然該操做會鎖行,其餘的不能進行操做。
SET autocommit=0;
DELETE FROM test_tbl WHERE id=1;
在開啓事務的狀況下,另外一個用戶在表界面手動刪除id=1的用戶,會出現鎖行的狀況出現
commit
綜上,若是有事務,則其餘操做會被鎖行,等到事務提交後,才能對鎖行的進行
編輯、刪除
操做。
關於事務的一篇文章,你們能夠看看:
MySQL默認操做模式就是 autocommit
自動提交模式。這就表示除非顯式地開始一個事務,不然每一個查詢都被當作一個單獨的事務自動執行。咱們能夠經過設置autocommit的值改變是不是自動提交autocommit模式。
經過如下命令能夠查看當前autocommit模式
mysql> show variables like 'autocommit'; | |
---|---|
Variable_name | Value |
autocommit | ON |
1 row in set (0.04 sec)
從查詢結果中,咱們發現Value的值是ON,表示autocommit開啓。咱們能夠經過如下SQL語句改變這個模式
mysql> set autocommit = 0;
值0和OFF都是同樣的,固然,1也就表示ON。經過以上設置autocommit=0,則用戶將一直處於某個事務中,直到執行一條commit提交或rollback語句纔會結束當前事務從新開始一個新的事務。
舉個例子:
張三給李四轉帳500元。那麼在數據庫中應該是如下操做:
1,先查詢張三的帳戶餘額是否足夠
2,張三的帳戶上減去500元
3,李四的帳戶上加上500元
以上三個步驟就能夠放在一個事務中執行提交,要麼所有執行要麼所有不執行,若是一切都OK就commit提交永久性更改數據;若是出錯則rollback回滾到更改前的狀態。
利用事務處理就不會出現張三的錢少了李四的帳戶卻沒有增長500元或者張三的錢沒有減去李四的帳戶卻加了500元。
MySQL默認的存儲引擎是MyISAM,MyISAM存儲引擎不支持事務處理,因此改變autocommit沒有什麼做用。但不會報錯,因此要使用事務處理的童鞋必定要肯定你所操做的表示支持事務處理的,如InnoDB。若是不知道表的存儲引擎能夠經過查看建表語句查看建表的時候有沒有指定事務類型的存儲引擎,若是沒有指定存儲引擎默認則是MyISAM不支持事務的存儲引擎。
固然,事務處理是爲了保障表數據原子性、一致性、隔離性、持久性。這些都是要消耗系統資源的,要謹慎選擇。
php中使用事物實例
$state = 0; // 添加事物處理 try { // 開啓事物 $GLOBALS['db']->beginTransaction(); // 更新管理平臺密碼 $state = $GLOBALS['db']->query("update admin_user set password='$password_confirm' where user_id=$user_id"); if($state != true) { throw new Exception ('更新管理平臺密碼失敗!'); } $ret = $this->modify_ldap_pwd($user_name, $user_password_old, $user_password_confirm); if(!$ret) { throw new Exception ('更新LDAP密碼失敗!'); } // 提交事物 $GLOBALS['db']->commit(); $state = 1; } catch (Exception $e) { // 回滾 $GLOBALS['db']->rollBack(); }
一個表的外鍵一定是另一個表的主鍵,只有innodB
支持外鍵和事務處理。
在數據庫應用,咱們常常要用到惟一編號,以標識記錄。在MySQL中可經過數據列的AUTO_INCREMENT屬性來自動生成。mysql支持多種數據表,每種數據表的自增屬性都有差別,這裏將介紹各類數據表裏的數據列自增屬性。
數據庫中設置了自增列,有時候須要清楚數據庫重新錄入數據.最多見的作法就是使用sql語句"delete 代表名"或是直接選中數據,而後刪除數據.可是再次插入數據的時候,你就會發現自增列會從上次刪除數據的最大值的下一個值開始,而不是從1開始的.有沒有一種感受,感受挺苦惱的.
如今就交你一種方法,讓你刪除數據後,再次插入記錄的時候,自增列從1開始.
truncate table 你的表名
// 這樣不但將數據所有刪除,並且從新定位自增的字段
truncate table `goods_tbl`;
今天在設計數據表時,忽然發現原來FLOAT
是很不靠譜的,因此在這裏建議你們換成DOUBLE
類型,
緣由是:
在mysql手冊中講到,在MySQL中的全部計算都是使用雙精度完成的,使用float(單精度)會有偏差,出現意想不到的結果。
在咱們查詢數據時,MySQL使用64位十進制數值的精度執行DECIMAL操做,float(5.54) = 5.54 若是出現精度丟失,這個是不等的。這樣,原本咱們應該能查到的數據就會莫名其妙的消失。