Mysql5.X重点难点速记
生活随笔
收集整理的這篇文章主要介紹了
Mysql5.X重点难点速记
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
瀏覽了一遍入門到精通,把常用的重要的又難記的內容記錄稍微留了一下。基于版本為5.7,實際上5.x大部分都是通用的。
參考了許多資料,在此不一一感謝,知識在于分享,下面的內容大家也可以自由轉載。
#數據庫創建 CREATE DATABASE yourdbname; --原句 CREATE DATABASE IF NOT EXISTS yourdbname DEFAULT CHARSET utf8 COLLATE utf8_general_ci; --一些常用選項#數據表創建 CREATE TABLE IF NOT EXISTS `tb1`(`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,`title` VARCHAR(100) NOT NULL,`author` VARCHAR(40) NOT NULL,`date` DATE DEFAULT '2017-12-25',PRIMARY KEY ( `id` ) )ENGINE=InnoDB DEFAULT CHARSET=utf8; --常用選項,指定引擎和默認字符字段編碼#數據類型 DECIMAL--以近似值保存的嚴格小數位數,字段建立語法為DECIMAL(M,D)。 ·M是數字的最大數(精度)。其范圍為1~65(在較舊的MySQL版本中,允許的范圍是1~254),M 的默認值是10。 ·D是小數點右側數字的數目(標度)。其范圍是0~30,但不得超過M。--實際存儲時一共占M+2個字節,M為總數據長度,D為小數的精度。如果替換NUMERIC數據類型,會自動轉為DECIMAL類型進行存儲。--在插入數據時,首先會用精度函數進行小數控制轉換,后實際存儲為字符串,這意味著DECIMAL(3,2)可存儲5字節的數字。也就是最小值為-9.99(length("-9.99")==5),最大值為99.99(length("99.99")==5) 一看便知的存儲范圍對比: DECIMAL(4,1) -999.9 到 9999.9 DECIMAL(5,1) -9999.9 到 99999.9 DECIMAL(6,1) -99999.9 到 999999.9 DECIMAL(6,2) -9999.99 到 99999.99 DECIMAL(6,3) -999.999 到 9999.999#關鍵字 REGEXP --使用正則表達式驗證值,返回是否--示例:SELECT * FROM th1 WHERE tb1.column REGEXP('exp');#自定義函數--小例子:模擬隨機日期,時間范圍從1990年~2017年。 CREATE FUNCTION randomTime() RETURNS VARCHAR(20) RETURN CONCAT(FLOOR(1990 + (RAND() * 28)),'-',LPAD(FLOOR(1 + (RAND() * 12)),2,0),'-',LPAD(FLOOR(3 + (RAND() * 8)),2,0));--小例子:模擬隨機時間,00:00:00~23:59:59 CREATE FUNCTION randomTime() RETURNS VARCHAR(20) RETURN CONCAT(LPAD(FLOOR(0 + (RAND() * 23)),2,0),':',LPAD(FLOOR(0 + (RAND() * 59)),2,0),':',LPAD(FLOOR(0 + (RAND() * 59)),2,0));--小例子:隨機手機號(未嚴格處理真實手機號段,僅生成1開頭的11位隨機字符串) CREATE FUNCTION randomPhone() RETURNS VARCHAR(20) RETURN UNIX_TIMESTAMP()*10+floor(rand()*4000000000);#存儲過程--最佳適用范圍:因為<b>性能需要</b>而進行編寫,將眾多操作流程統一編寫在一個存儲過程中完成。如果采用外部語言進行編寫,可能會因為Mysql和語言之間的Socket傳輸而使性能損耗。--不應該把業務都封裝為存儲過程,不同DB之間的存儲過程語法幾乎全無共通性,這會加大遷移難度。--練習的小例子:用上面的函數生成任意大數據表,包含id,phone,time三個字段 DROP PROCEDURE IF EXISTS `proc_inc_id`; DELIMITER ;; --防止定義語句中的;符號與實際輸入語句的;符號沖突 CREATE PROCEDURE `proc_inc_id`(IN start int, IN n int) BEGINDECLARE i int;DECLARE phone VARCHAR(20);DECLARE time VARCHAR(30);SET i = start;SET phone = randomPhone();SET time = CONCAT(randomDate(), ' ', randomTime());WHILE i <= n DOINSERT INTO `test` VALUES(i, phone, time);SET i = i + 1;SET phone = randomPhone();SET time = CONCAT(randomDate(), ' ', randomTime());END WHILE; END;; DELIMITER ; --還原語句分隔符--如何調用:call proc_inc_id(1, 100); --第一參數是起始值--生成結果:效果還不錯~ id phone time 1 17353812960 1993-12-05 21:32:00 2 16627556306 2013-01-09 14:54:42 3 18411883028 2015-02-10 09:12:44 4 15776347886 2004-02-03 03:20:21 5 18166751923 2009-02-08 03:36:36 6 16064327817 1998-10-03 19:12:26 7 17560492889 2008-07-09 04:41:51 8 16349305149 2014-05-06 01:01:52 9 16755050365 1998-05-10 07:04:18 10 16495763250 2011-10-07 12:57:17#性能優化:索引的重要性(100W數據量,上下分別為加索引之前和加索引之后) mysql> select * from test order by phone limit 1; +--------+-------------+---------------------+ | id | phone | datetime | +--------+-------------+---------------------+ | 796917 | 15147847086 | 2012-01-08 11:25:34 | +--------+-------------+---------------------+ 1 row in set (0.40 sec)mysql> select * from test order by phone limit 1; +--------+-------------+---------------------+ | id | phone | datetime | +--------+-------------+---------------------+ | 796917 | 15147847086 | 2012-01-08 11:25:34 | +--------+-------------+---------------------+ 1 row in set (0.01 sec) <-冷啟動,后續就是0.00了往后為主從、集群的配置,此處不具體實踐。
627/627
轉載于:https://my.oschina.net/u/2953734/blog/1594685
總結
以上是生活随笔為你收集整理的Mysql5.X重点难点速记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue.js 2.0 官方文档学习笔记
- 下一篇: linux cmake编译源码,linu