SQL查詢中的小技巧:SELECT 1 和 LIMIT 1 替代 count(*)

2023-09-15 12:02:21

前言

在寫SQL查詢時,常規做法是使用SELECT count(*)來統計符合條件的記錄數。

然而,在某些情況下,我們只關心是否存在符合條件的記錄,而不需要知道具體的記錄數。

為了優化效能,可以改用使用SELECT 1LIMIT 1的方式查詢。

在業務程式碼中,直接判斷查詢結果是否非空即可,不再需要使用count來獲取記錄數。

實戰

我們使用Java和MyBatis演示優化方案的程式碼範例。

假設我們有一個名為User的資料庫表,其中包含idnameage欄位。我們想要檢查是否存在年齡大於等於18歲的使用者。

  1. 建立一個UserMapper介面,定義一個方法來執行查詢操作:
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper {
    Integer existUsersWithAgeGreaterThan(int age);
}

  1. UserMapper.xml中實現這個方法,使用優化的SQL語句:
<?xml version="1.0" encoding="UTF-8"?>
<mapper namespace="com.example.mapper.UserMapper">

    <select id="existUsersWithAgeGreaterThan" resultType="java.lang.Integer">
        SELECT 1 FROM users WHERE age >= #{age} LIMIT 1
    </select>

</mapper>

  1. 然後,在業務程式碼中呼叫existUsersWithAgeGreaterThan方法進行判斷:
import com.example.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    private final UserMapper userMapper;

    @Autowired
    public UserService(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    public void checkUsersWithAgeGreaterThan(int age) {
        Integer exist = userMapper.existUsersWithAgeGreaterThan(age);
        if (exist != null) {
            // 當存在滿足條件的使用者時,執行這裡的程式碼
            System.out.println("存在符合條件的使用者");
        } else {
            // 當不存在滿足條件的使用者時,執行這裡的程式碼
            System.out.println("不存在符合條件的使用者");
        }
    }
}

通過呼叫existUsersWithAgeGreaterThan方法獲取查詢結果,並根據結果是否為空來判斷是否存在滿足條件的使用者。

優化

既然講到這裡,也就順便提一下資料庫查詢的一般效能調優做法,在資料量十分龐大的情況下,這裡給出幾點建議:

  1. 索引優化:確保在查詢條件列上存在適當的索引,以加快查詢速度。比如當前的範例,可以在age列上建立索引;

  2. 分頁查詢:如果只關心是否存在滿足條件的記錄,但不需要具體的記錄內容,可以考慮使用分頁查詢的方式進行優化。通過限制返回結果的數量,可以減少查詢的開銷;

  3. 快取機制:如果查詢結果相對穩定或者經常被重複查詢,可以考慮使用快取來避免重複的資料庫查詢操作,從而提高響應速度,比如把前幾頁快取下來,因為很多使用者可能不會一直往後點;

  4. 資料庫調優:對資料庫進行效能調優,包括優化查詢計劃、調整記憶體設定、合理設定資料庫連線池等,可以提升整體查詢效能。

總結

其實案例中的優化方案在查詢結果集較大時已經非常有效,可以說是肉眼可見的效能提升,在某些情況下還可以減少聯合索引的建立。

總而言之,通過使用SELECT 1LIMIT 1代替SELECT count(*),可以提高查詢效能並簡化業務程式碼,特別適用於僅需判斷是否存在符合條件的記錄的場景。

好了,今天這個小知識,你學會了嗎?


如果喜歡請點贊關注↓↓↓,持續分享乾貨哦!