[MySQL] 效能調教 - 取代 offset

AlanHuang
·
·
IPFS
·

代替 offset


更快方式


id 篩選


select id, name, phone_number,

              create_time, update_time, status

              from member

WHERE id >= (SELECT id FROM member WHERE id = 157

              order by id desc limit 0 ,1) LIMIT 10000


inner join 方式


select t.id, t.name, t.phone_number,

              t.create_time,

              t.update_time, t.status

FROM (SELECT id FROM member

                  WHERE id = 157

                  order by id desc limit 10000 offset 0) q JOIN member t ON t.id = q.id;


---------


合理的建立索引的建議:

(1) 越小的資料型別通常更好:越小的資料型別通常在磁碟、記憶體和 CPU 快取中都需要更少的空間,處理起來更快。 

(2) 簡單的資料型別更好:整型資料比起字元,處理開銷更小,因為字串的比較更復雜。在 MySQL 中,應該用內建的日期和時間資料型別,而不是用字串來儲存時間;以及用整型資料型別儲存 IP 地址。

(3) 儘量避免 NULL:應該指定列為 NOT NULL,除非你想儲存 NULL。在 MySQL 中,含有空值的列很難進行查詢優化,因為它們使得索引、索引的統計資訊以及比較運算更加複雜。你應該用 0、一個特殊的值或者一個空串代替空值

這部分是關於索引和寫 SQL 語句時應當注意的一些瑣碎建議和注意點。

1. 當結果集只有一行資料時使用 LIMIT 1

2. 避免 SELECT *,始終指定你需要的列

從表中讀取越多的資料,查詢會變得更慢。他增加了磁碟需要操作的時間,還是在資料庫伺服器與 WEB 伺服器是獨立分開的情況下。你將會經歷非常漫長的網路延遲,僅僅是因為資料不必要的在伺服器之間傳輸。

3. 使用連線(JOIN)來代替子查詢 (Sub-Queries)

      連線(JOIN).. 之所以更有效率一些,是因為 MySQL 不需要在記憶體中建立臨時表來完成這個邏輯上的需要兩個步驟的查詢工作。

4. 使用 ENUM、CHAR 而不是 VARCHAR,使用合理的欄位屬性長度

5. 儘可能的使用 NOT NULL

6. 固定長度的表會更快

7. 拆分大的 DELETE 或 INSERT 語句

8. 查詢的列越小越快

 Where 條件

在查詢中,WHERE 條件也是一個比較重要的因素,儘量少並且是合理的 where 條件是很重要的,儘量在多個條件的時候,把會提取儘量少資料量的條件放在前面,減少後一個 where 條件的查詢時間。

有些 where 條件會導致索引無效:

Ø where 子句的查詢條件裡有!=,MySQL 將無法使用索引。

Ø where 子句使用了 Mysql 函式的時候,索引將無效,比如:select * from tb where left (name, 4) = ‘xxx’

Ø 使用 LIKE 進行搜尋匹配的時候,這樣索引是有效的:select * from tbl1 where name like ‘xxx%’,而 like ‘% xxx%’ 時索引無效


CC BY-NC-ND 2.0 授权

喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!