創(chuàng)建數(shù)據(jù)表:
SQL Code復制內(nèi)容到剪貼板
PHP Code復制內(nèi)容到剪貼板
SQL添加一個字段
SQL Code復制內(nèi)容到剪貼板
SQL添加一個枚舉類型的字段(節(jié)省數(shù)據(jù)庫資源)
SQL Code復制內(nèi)容到剪貼板
SQL添加索引
SQL Code復制內(nèi)容到剪貼板
添加字段:
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)容到剪貼板刪:
SQL Code復制內(nèi)容到剪貼板改:
SQL Code復制內(nèi)容到剪貼板查:
SQL Code復制內(nèi)容到剪貼板
表的記錄數(shù):
SQL Code復制內(nèi)容到剪貼板
keyboard的存儲格式是:1,3,4的格式存儲
我們的$tagId 假設(shè)是4,那么我們需要找到 keyboard中含有4的條數(shù),那么就是FIND_IN_SET的出場了
場景一:
(一對多,以多條件為基準,查詢一)


要求: 查詢 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)容到剪貼板

這里的datetime會有點問題,可以在sql中轉(zhuǎn)換一下
SQL Code復制內(nèi)容到剪貼板
同一張表中,查詢符合兩條記錄的記錄,示意圖:

需要查詢出,同時符合,filter_id = 5,并且符合filter_id = 6的數(shù)據(jù)
SQL Code復制內(nèi)容到剪貼板
結(jié)果,article_id=25的已經(jīng)沒有了

(如果是多個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)容到剪貼板
關(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)容到剪貼板
用下面的語句替換:exists與in產(chǎn)生同樣的結(jié)果
PHP Code復制內(nèi)容到剪貼板
4.禁止select *,select count(*)
如果需要使用count,請在括號中加上索引字段
5.盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描,改用=代替
6.盡量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,如:
PHP Code復制內(nèi)容到剪貼板可以這樣查詢:
PHP Code復制內(nèi)容到剪貼板
7.應(yīng)盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:
在建立字段的時候默認值不要為null,為空
PHP Code復制內(nèi)容到剪貼板
8.避免使用前置百分號的模糊查詢,不走索引,可以使用后百分號,避免使用前百分號
9.不要在 where 子句中的“=”左邊進行函數(shù)、算術(shù)運算或其他表達式運算,否則系統(tǒng)將可能無法正確使用索引。
PHP Code復制內(nèi)容到剪貼板應(yīng)改為:
PHP Code復制內(nèi)容到剪貼板
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
新聞熱點
疑難解答
圖片精選