国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

mysql執(zhí)行語句(SQL優(yōu)化實例)

2024-07-24 12:40:17
字體:
供稿:網(wǎng)友

創(chuàng)建數(shù)據(jù)表:

SQL Code復制內(nèi)容到剪貼板
  1. CREATE TABLE `test1` (    
  2.     `id` int(11) NOT NULL AUTO_INCREMENT,    
  3.     `firstname` TINYBLOB NOT NULL COMMENT '用戶名/支持表情符號255字節(jié)',/* 修改字段類型 */  
  4.     `question_id` int(11) NOT NULL DEFAULT '0' COMMENT '問題ID',    
  5.     `customer_id` int(11) NOT NULL DEFAULT '0' COMMENT '用戶ID',    
  6.     `approved` tinyint(1) NOT NULL DEFAULT '0' COMMENT '字段備注',    
  7.     `customer_name` varchar(32) NOT NULL DEFAULT '' COMMENT '用戶姓名',    
  8.     `customer_phone` varchar(11) NOT NULL DEFAULT '' COMMENT '用戶手機號',    
  9.     `value` text NOT NULL COMMENT '值',    
  10.     `order_total` decimal(15,4) NOT NULL DEFAULT '0.0000',    
  11.     `status` enum('new','invalid','valid','transfered') NOT NULL DEFAULT 'new',    
  12.     `date_added` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',    
  13.     PRIMARY KEY (`id`),    
  14.     KEY `question_id` (`question_id`)    
  15. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;    

 

 

PHP Code復制內(nèi)容到剪貼板
  1. 標準命令:mysql -u數(shù)據(jù)庫用戶名 -p數(shù)據(jù)庫密碼 數(shù)據(jù)庫名 < 數(shù)據(jù)庫文件名.sql  
  2. 示范案例:mysql -ulaozuo -plaozuo.org laozuo < laozuo.sql  

 

 

 

SQL添加一個字段

SQL Code復制內(nèi)容到剪貼板
  1. ALTER TABLE `test1` ADD COLUMN `description` varchar(255) NOT NULL DEFAULT '' COMMENT '備注';   

 

SQL添加一個枚舉類型的字段(節(jié)省數(shù)據(jù)庫資源)

SQL Code復制內(nèi)容到剪貼板
  1. ALTER TABLE `mcc_service_question_options` ADD COLUMN `if_temp` ENUM(  'use_temp',  'no_temp') NOT NULL DEFAULT  'no_temp' COMMENT '回復是否有模板';  

 

SQL添加索引

SQL Code復制內(nèi)容到剪貼板
  1. ALTER TABLE `test1` ADD INDEX (`question_id`);  

 

添加字段:
alter table 表名
Add column 字段名 字段類型 默認值 AFTER 字段名 (在哪個字段后面添加)


例子:
alter table appstore_souapp_app_androidmarket
Add column getPriceCurrency varchar(50) default null AFTER getPrice

 

修改字段:
alter table表名
change 字段名 新字段名 字段類型 默認值


例子:
alter table appstore_souapp_app_androidmarket change hasPrice hasPrice varchar(10) null;

 

刪除字段:
alter table 表名 drop column 字段名

例子:
alter table appstore_souapp_app_androidmarket
drop column getPriceCurrency

 

調(diào)整字段順序:
alter table 表名
change 字段名 新字段名 字段類型 默認值 after 字段名(跳到哪個字段之后)


例子:
alter table appstore_souapp_app_androidmarket
change getPriceCurrency getPriceCurrency varchar(50) default null AFTER getPrice

 

增:

SQL Code復制內(nèi)容到剪貼板
  1. INSERT INTO `test1` (`value`, `status`) VALUES ('值測試', 'new');  

刪:

SQL Code復制內(nèi)容到剪貼板
  1. DELETE FROM `test1` where `id`='1';  

改:

SQL Code復制內(nèi)容到剪貼板
  1. UPDATE `test1` SET `question_id` = '10' WHERE `id` = '2';  

查:

SQL Code復制內(nèi)容到剪貼板
  1. SELECT * FROM `test1` WHERE id = 2  

 

表的記錄數(shù):

SQL Code復制內(nèi)容到剪貼板
  1. SELECT COUNT(*) AS `total` FROM `test1`  

 

 

1.jpg 

keyboard的存儲格式是:1,3,4的格式存儲
我們的$tagId 假設(shè)是4,那么我們需要找到 keyboard中含有4的條數(shù),那么就是FIND_IN_SET的出場了

SQL Code復制內(nèi)容到剪貼板
  1. // 查詢新聞表中,keyboard字段中包含 tagid  
  2.   
  3. select * from {$dbtbpre}ecms_news where FIND_IN_SET('".$tagId."',keyboard) group by id order by id desc limit 15  

 

場景一:

(一對多,以多條件為基準,查詢一)

要求: 查詢 biz_order 訂單表的時候,關(guān)聯(lián)查詢 biz_order_goods 商品表(一對多)的結(jié)束時間:course_end_time, 查詢訂單列表,如果有其中一條關(guān)聯(lián)商品的結(jié)束時間,大于當前時間,那么不展示該條訂單

這里的id為1 的商品,有一條商品的結(jié)束時間在7月份,設(shè)當前是6月份,那么訂單1,就應(yīng)該是不展示的,看一下sql:

 

SQL Code復制內(nèi)容到剪貼板
  1. SELECT  
  2.     t.*, t2.maxVal  
  3. FROM  
  4.     `biz_order` t  
  5. JOIN (  
  6.     SELECT  
  7.         order_id,  
  8.         MAX(course_end_time) maxVal  
  9.     FROM  
  10.         `biz_order_goods`  
  11.     GROUP BY  
  12.         order_id  
  13. ) t2 ON t.id = t2.order_id WHERE t.id in (1,2,3) and t2.maxVal < '2017-06-07 9:54';  

3.jpg

 

 

 

這里的datetime會有點問題,可以在sql中轉(zhuǎn)換一下

SQL Code復制內(nèi)容到剪貼板
  1. SELECT  
  2.     t.id,t.order_no, t2.maxVal  
  3. FROM  
  4.     `biz_order` t  
  5. JOIN (  
  6.     SELECT  
  7.         order_id,  
  8.         MAX( UNIX_TIMESTAMP(course_end_time) ) maxVal  
  9.     FROM  
  10.         `biz_order_goods`  
  11.     GROUP BY  
  12.         order_id  
  13. ) t2 ON t.id = t2.order_id WHERE t.id in (1,2,3) and t2.maxVal < '1496801089';  

5.jpg

 


 

同一張表中,查詢符合兩條記錄的記錄,示意圖:

 QQ圖片20171208142749.png

需要查詢出,同時符合,filter_id = 5,并且符合filter_id = 6的數(shù)據(jù)

SQL Code復制內(nèi)容到剪貼板
  1. SELECT *  
  2. FROM `hzb_article_filter`  
  3. WHERE filter_id IN (  
  4.     SELECT filter_id  
  5.     FROM `hzb_article_filter`  
  6.     WHERE filter_id IN(5,6)  
  7.     GROUP BY article_id  
  8.     HAVING COUNT(*) > 1  
  9. )  

 

結(jié)果,article_id=25的已經(jīng)沒有了

 QQ截圖20171208142940.png

 (如果是多個ID:select * from hzb_article_filter WHERE filter_id in (select filter_id from hzb_article_filter WHERE filter_id in(2,5,11,13) GROUP BY article_id HAVING COUNT(*) > 3))

 

上面的有問題,另一種方式,join:

SQL Code復制內(nèi)容到剪貼板
  1. SELECT  
  2.     `t1`.*  
  3. FROM  
  4.     `hzb_article_filter` `t1`  
  5. JOIN `hzb_article_filter` `t2` ON t1.article_id = t2.article_id  
  6. AND t2.filter_id = 5  
  7. JOIN `hzb_article_filter` `t3` ON t2.article_id = t3.article_id  
  8. AND t3.filter_id = 8  
  9. JOIN `hzb_article_filter` `t4` ON t3.article_id = t4.article_id  
  10. AND t4.filter_id = 13  
  11. WHERE  
  12.     t1.filter_id = 3  

 

 

 


 

關(guān)于SQL的一些優(yōu)化及注意點:

由于系統(tǒng)的瓶頸大多出現(xiàn)在數(shù)據(jù)庫層面,所以對數(shù)據(jù)庫的操作需要提出一些開發(fā)原則,這些開發(fā)原則在前期可能會增加工作量,并且對系統(tǒng)性能的提升并不大,反而某些復雜語句可能會影響性能,但是在數(shù)據(jù)量急劇膨脹后,會帶來性能上的極大提升,并且為sql語句的調(diào)優(yōu),以及系統(tǒng)的拆分打下了良好的基礎(chǔ),開發(fā)人員需要嚴格遵守。

1.禁止兩張表以上的關(guān)聯(lián)查詢。

在數(shù)據(jù)量較大時,連表查詢會嚴重拖慢數(shù)據(jù)庫性能,將大sql拆分成多個子sql,在程序中拼接數(shù)據(jù)。

可以使用left join, innerjoin, 等,但不要兩張以上的數(shù)據(jù)表聯(lián)查,可以在查詢出來以后做foreach再繼續(xù)查詢,分割為小SQL,在數(shù)據(jù)量小的情況下可能還會慢一點,但在數(shù)據(jù)量大的情況下,就是翻倍的提高效率

 

2.禁止使用存儲過程、函數(shù)、觸發(fā)器、外鍵約束。

后期帶來的壞處比好處多,互聯(lián)網(wǎng)公司不這么玩。

 

3.禁止使用in子查詢和not in。

不走索引

對于連續(xù)的數(shù)值,能用 between 就不要用 in 了,

如:

PHP Code復制內(nèi)容到剪貼板
  1. select id from t where num between 1 and 3  
  2. select num from a where num in(select num from b)  

 

用下面的語句替換:exists與in產(chǎn)生同樣的結(jié)果

PHP Code復制內(nèi)容到剪貼板
  1. select num from a where exists(select 1 from b where num=a.num)  

 

4.禁止select *,select count(*)

如果需要使用count,請在括號中加上索引字段

 

5.盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描,改用=代替

 

6.盡量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,如:

PHP Code復制內(nèi)容到剪貼板
  1. select id from t where num=10 or num=20  

可以這樣查詢:

PHP Code復制內(nèi)容到剪貼板
  1. select id from t where num=10 unsion all select id from t where num=20  

 

7.應(yīng)盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:

在建立字段的時候默認值不要為null,為空

PHP Code復制內(nèi)容到剪貼板
  1. select id from t where num is null  


8.避免使用前置百分號的模糊查詢,不走索引,可以使用后百分號,避免使用前百分號

PHP Code復制內(nèi)容到剪貼板
  1. select id from t where name like ‘%abc%’  
  2. select id from t where name like ‘%abc’  

 

9.不要在 where 子句中的“=”左邊進行函數(shù)、算術(shù)運算或其他表達式運算,否則系統(tǒng)將可能無法正確使用索引。

PHP Code復制內(nèi)容到剪貼板
  1. select id from t where num/2=100  

應(yīng)改為:

PHP Code復制內(nèi)容到剪貼板
  1. select id from t where num=100*2  

 

10、索引

索引的最左前綴匹配原則,mysql會一直向右匹配,直到遇到范圍查詢(>、<、between、like)就停止匹配,比如a=1 and b=2 and c>3 and d=4如果建立(a,b,c,d)的順序,d是用不到索引的如果建立(a,b,d,c)則都可以用到,a,b,d的順序可以任意調(diào)整,mysql優(yōu)化器會優(yōu)化成索引可以識別的形式,也就是說盡量將=條件寫在最前面,最后再使用范圍查詢

 

 簽名生成規(guī)則

必填參數(shù):time,sign

1.過去所有業(yè)務(wù)參數(shù)鍵集合,在此基礎(chǔ)上增加一個time參數(shù)為發(fā)起接口的unix時間戳。

2.將接口參數(shù)鍵集合做升序排列 ,按順序取出鍵對應(yīng)的值,通過=相連。

3.最后,將上述鍵值對相連,在最后加上scretkey形成一個字符串,將形成的字符串通過md5算法,獲取簽名值,完成簽名。

例如:

某接口業(yè)務(wù)參數(shù)為

a=1,b=2,time對應(yīng) 的時間戳為3,內(nèi)部的scretkey為4

sign=md5(a=1b=2time=34)

接口請求

http://xx.com?b=2&a=1&time=3&sign=xx

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 高安市| 华坪县| 洪湖市| 宁武县| 舞钢市| 克山县| 乡城县| 苏州市| 洛浦县| 论坛| 分宜县| 龙川县| 张家界市| 大荔县| 礼泉县| 蒙山县| 淅川县| 长海县| 阿克| 平江县| 永泰县| 玛多县| 新巴尔虎左旗| 民县| 仲巴县| 沧源| 岢岚县| 蓬莱市| 六枝特区| 西盟| 虞城县| 耿马| 新泰市| 朝阳县| 竹溪县| 沙湾县| 逊克县| 长汀县| 东平县| 肇州县| 高平市|