1. 程式人生 > 其它 >語音交友APP原始碼中MySQL資料庫開發的6個“避免”

語音交友APP原始碼中MySQL資料庫開發的6個“避免”

由於在語音交友APP原始碼中需要進行MySQL資料庫的開發,而MySQL資料庫開發又會涉及到許多操作,所以要儘量避免在語音交友APP原始碼開發中出現相關的錯誤,以下就是應該避免的問題。

1、避免在資料庫中做運算

有句話叫做“別讓腳趾頭想事情,那是腦瓜子的職責”,用在資料庫開發中,說的就是避免讓語音交友APP原始碼的資料庫做她不擅長的事情。MySQL並不擅長數學運算和邏輯判斷,所以儘量不在語音交友APP原始碼資料庫做運算,複雜運算可以移到程式端CPU。

2、避免對索引列做運算
有次,有位同事讓我看一條SQL,說是在前臺查詢很快,但是把SQL取出來,在資料庫中執行的時候,跑10分鐘都不出結果。
看了一下SQL,最後定位到一個檢視中的一個子查詢上面。該子查詢的SQL文字如下:

SELECT  acinv_07.id_item ,
        SUM(acinv_07.dec_endqty) dec_endqty
FROM    acinv_07
WHERE   acinv_07.fiscal_year * 100 + acinv_07.fiscal_period 
        = ( SELECT DISTINCT
                   ctlm1101.fiscal_year * 100 + ctlm1101.fiscal_period
                   FROM ctlm1101 WHERE flag_curr = 'Y'
                   AND id_oprcode = 'acinv'
                   AND acinv_07.id_wh = ctlm1101.id_table)
GROUP BY acinv_07.id_item

在acinv_07表上的列fiscal_year和列fiscal_period是有索引的。但是,如果對索引列進行運算,就會導致原本可以走索引的走不了索引。於是,動手改寫成如下SQL:

SELECT    id_item ,
                    SUM(dec_qty) dec_qty
          FROM      dpurreq_03
          GROUP BY  id_item
        ) a ,
        ( SELECT    a.id_item ,
                    SUM(a.dec_endqty) dec_endqty
          FROM      acinv_07 a ,
                    ( SELECT DISTINCT
                                ctlm1101.fiscal_year ,
                                ctlm1101.fiscal_period ,
                                id_table
                      FROM      ctlm1101
                      WHERE     flag_curr = 'Y'
                                AND id_oprcode = 'acinv'
                    ) b
          WHERE     a.fiscal_year = b.fiscal_year
                    AND a.fiscal_period = b.fiscal_period
                    AND a.id_wh = b.id_table
          GROUP BY  a.id_item

再執行,4s鐘左右就可以跑出結果了。
總的來說,在語音交友APP原始碼中寫SQL時,不到萬不得已,不要對索引列進行計算。

3、避免count(*)
在分頁查詢的時候,有的人總是習慣用select count()獲得總的記錄條數,實際上這不是一個高效的做法,因為,之前獲得資料的時候已經查詢過一次了,select count()相當於同一個語句查詢了兩次,對語音交友APP原始碼的資料庫開銷自然就大了,我們應當使用語音交友APP原始碼資料庫自帶的API,或者系統變數來完成這個工作。

4、避免使用NULL欄位
大家在語音交友APP原始碼資料庫表字段設計的時候,應該儘量都加上NOT NULL DEFAULT ‘’。
使用NULL欄位會產生很多不好的影響,例如:很難進行查詢優化、NULL列加索引,需要額外空間、含NULL複合索引無效……
看下面的案例:

資料初始化:
create table table1 (
    `id` INT (11) NOT NULL,
    `name` varchar(20) NOT NULL
)
create table table2 (
    `id` INT (11) NOT NULL,
    `name`  varchar(20)
)
insert into table1 values (4,"zhaoyun"),(2,"zhangfei"),(3,"liubei")
insert into table2 values (1,"zhaoyun"),(2, null)

(1) NOT IN子查詢在有NULL值的情況下返回永遠為空結果,查詢容易出錯

select name from table1 where name not in (select name from table2 where id!=1)


(2) 列值允許為空,索引不儲存null值,結果集中不會包含這些記錄。

select * from table2 where name != 'zhaoyun'

select * from table2 where name != 'zhaoyun1'


(3) 使用concat拼接時,首先要對各個欄位進行非null判斷,否則只要任何一個欄位為空都會造成拼接的結果為null

select concat("1", null) from dual;


(4) 當計算count時候null column不會計入統計

select count(name) from table2;


**5、避免select ***

使用select可能會返回不使用的列的資料。它在MySQL資料庫伺服器和語音交友APP原始碼之間產生不必要的I/O磁碟和網路流量。
如果明確指定列,則結果集更可預測並且更易於管理。想象一下,當您使用select
並且有人通過新增更多列來更改表格資料時,將會得到一個與預期不同的結果集。
使用select *可能會將敏感資訊暴露給未經授權的語音交友APP原始碼使用者。

6、避免在資料庫裡存圖片

語音交友APP原始碼中的圖片確實是可以儲存到資料庫裡的,例如通過二進位制流將圖片存到資料庫中。

但是,強烈不建議把圖片儲存到語音交友APP原始碼資料庫中!!!!首先對資料庫的讀/寫的速度永遠都趕不上檔案系統處理的速度,其次資料庫備份變的巨大,越來越耗時間,最後對語音交友APP原始碼檔案的訪問需要穿越你的應用層和資料庫層。

語音交友APP原始碼中的圖片是資料庫最大的殺手。一般來說資料庫都是儲存一個URL,然後再通過URL來呼叫圖片。圖片,檔案,二進位制數這三樣東西慎重儲存到資料庫中。以上就是“語音交友APP原始碼中MySQL資料庫開發的6個“避免””的全部內容,希望對大家有幫助。
本文轉載自網路,轉載僅為分享乾貨知識,如有侵權歡迎聯絡雲豹科技進行刪除處理
原文連結:https://segmentfault.com/a/1190000037694188