1. 程式人生 > >MYSQL語句優化:limit和count的優化

MYSQL語句優化:limit和count的優化

正 文:

SQL語句的優化大有學問,不同的寫法取得的效果大為不同。今例舉limit和count語句來作下探討
1,limit語句的優化
常見的limit語句的形式為:LIMIT m,n;隨之偏移量m的增大,limit語句的執行效率也跟著下降。所以,優化limit的原則是儘量不要使用偏移量m,將limit m,n轉換為limit n的形式,萬一非要使用偏移量m,也要m儘可能的小。 現在,從表items表中,找出10000之後的10條記錄。一般的查詢方法如下:
mysql> explain select ItemID,ItemName,Code from items  limit 10000,10;
+----+-------------+-------+------+---------------+------+---------+------+-------+-------+

| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows  | Extra |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------+
|  1 | SImpLE      | items | ALL  | NULL          | NULL | NULL    | NULL | 22116 |       |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------+

1 row in set (0.00 sec)
索引型別為ALL,而且是全表掃描,影響的行數整張表的記錄總數。可見是對全行資料進行偏移。 一個簡單的技巧是對索引資料進行偏移,然後將索引資料與全行資料內聯,得到所需的列。語句如下:
mysql> explain select ItemID from items INNER JOIN (select ItemID from items order by ItemID LIMIT 10000,10) AS items2 USING(ItemID);
+----+-------------+------------+--------+---------------+---------+---------+---------------+-------+-------------+

| id | select_type | table      | type   | possible_keys | key     | key_len | ref           | rows  | Extra       |
+----+-------------+------------+--------+---------------+---------+---------+---------------+-------+-------------+
|  1 | PRIMARY     |  | ALL    | NULL          | NULL    | NULL    | NULL          |    10 |             |
|  1 | PRIMARY     | items      | eq_ref | PRIMARY       | PRIMARY | 4       | items2.ItemID |     1 | Using index |
|  2 | DERIVED     | items      | index  | NULL          | PRIMARY | 4       | NULL          | 10010 | Using index |
+----+-------------+------------+--------+---------------+---------+---------+---------------+-------+-------------+
3 rows in set (0.00 sec)
上述查詢影響的rows書只有10010,查詢中對索引ItemID進行了排序。 還有一種查詢方法,使用子查詢,轉換為limit n形式。如下
mysql> explain select ItemID,ItemName,Code from items where ItemID >= 10000  order by ItemID limit 10;
+----+-------------+-------+-------+---------------+---------+---------+------+-------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows  | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+------+-------+-------------+
|  1 | SImpLE      | items | range | PRIMARY       | PRIMARY | 4       | NULL | 13563 | Using where |
+----+-------------+-------+-------+---------------+---------+---------+------+-------+-------------+
1 row in set (0.00 sec)
如果可以確定記錄的具體位置,也可以使用between….and…來達到效果 mysql> explain select ItemID,ItemName,Code FROM items where ItemID between 10000 and 10010 order by ItemID;
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
|  1 | SImpLE      | items | range | PRIMARY       | PRIMARY | 4       | NULL |    8 | Using where |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+ count語句的優化
count語句不好做優化,只有寫特例,在沒有使用where語句的count查詢,非常快。也就是select count(*) from items 現在,查詢items表中,ItemID大於2的所有記錄。sql語句如下: +----+-------------+-------+-------+---------------+---------+---------+------+------+--------------------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra                    |
+----+-------------+-------+-------+---------------+---------+---------+------+------+--------------------------+
|  1 | SImpLE      | items | index | PRIMARY       | PRIMARY | 4       | NULL | 22114 | Using where; Using index |
+----+-------------+-------+-------+---------------+---------+---------+------+------+--------------------------+
1 row in set (0.00 sec)
對比如下查詢 mysql> explain  select (select count(*) from items) - count(*) from items where ItemID <= 2;
+----+-------------+-------+-------+---------------+---------+---------+------+------+------------------------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra                        |
+----+-------------+-------+-------+---------------+---------+---------+------+------+------------------------------+
|  1 | PRIMARY     | items | range | PRIMARY       | PRIMARY | 4       | NULL |    1 | Using where; Using index     |
|  2 | SUBQUERY    | NULL  | NULL  | NULL          | NULL    | NULL    | NULL | NULL | Select tables optimized away |
+----+-------------+-------+-------+---------------+---------+---------+------+------+------------------------------+
2 rows in set (0.00 sec)
第一句查詢影響了>2的所以行,第二句查詢影響了<=2的所以記錄。關鍵區別在(select count(*) from items) - count(*)來計算行數和where條件的不同。 還有一個有趣的地方,如果要統計同一列中不同值的記錄數。如items表裡產品上架(1)和下架(0)的不同數量。有兩種查詢方法,一種是使用count,一種是使用sum函式。 mysql> explain select count(isActive = '1' or null) as up,count(isActive = '0' or null) as down from items;
+----+-------------+-------+------+---------------+------+---------+------+-------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows  | Extra |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------+
|  1 | SImpLE      | items | ALL  | NULL          | NULL | NULL    | NULL | 22116 |       |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------+
1 row in set (0.00 sec)
mysql> explain select sum(if(isActive='1',1,0)) as up,sum(if(isActive='0',1,0)) as down from items;
+----+-------------+-------+------+---------------+------+---------+------+-------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows  | Extra |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------+
|  1 | SImpLE      | items | ALL  | NULL          | NULL | NULL    | NULL | 22116 |       |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------+
1 row in set (0.00 sec)

相關推薦

MYSQL語句優化limitcount優化

正 文: SQL語句的優化大有學問,不同的寫法取得的效果大為不同。今例舉limit和count語句來作下探討1,limit語句的優化。常見的limit語句的形式為:LIMIT m,n;隨之偏移量m的增大,limit語句的執行效率也跟著下降。所以,優化limit的原則是儘量不

Mysql語句執行效率檢查通過索引優化_例項

#通過對錶的主要欄位,新增索引的方式.可以顯著的提高查詢效率 ALTER TABLE t_jt_contract_integral_detail ADD INDEX index_us

Java並發編程synchronized優化

section ext 隨著 32bit 就是 -i 序列 UC 進行 每天學習一點點 編程PDF電子書、視頻教程免費下載:http://www.shitanlife.com/code 1. 使用方法 synchronized 是 java 中最常用的保證線程安全的方式,s

MySQL查詢優化limit查詢的優化

原文地址:https://dev.mysql.com/doc/refman/5.7/en/limit-optimization.html 譯文: 8.2.1.17 LIMIT查詢優化 如果你只需要結果集中特定數量的行,可以在查詢中使用LIMIT語句,而不是取出整個結果集然後扔掉

JavaScript的效能優化載入執行

隨著Web2.0技術的不斷推廣,越來越多的應用使用 JavaScript 技術在客戶端進行處理,從而使JavaScript在瀏覽器中的效能成為開發者所面臨的最重要的可用性問題。而這個問題又因JavaScript的阻塞特性變的複雜,也就是說當瀏覽器在執行JavaScript

MySQL 效能優化,索引查詢優化

轉載源:開源中國 (秋日芒草)要知道為什麼使用索引,要知道如何去使用好索引,使自己的查詢達到最優效能,需要先了解索引的資料結構和磁碟的存取原理參考部落格:MySQL索引背後的資料結構及演算法原理如上這篇部落格寫的挺好,我就不再造輪子了,對如上部落格,我總結如下幾個重要的要點:

MySQL效能優化,索引查詢優化

要知道為什麼使用索引,要知道如何去使用好索引,使自己的查詢達到最優效能,需要先了解索引的資料結構和磁碟的存取原理如上這篇部落格寫的挺好,我就不再造輪子了,對如上部落格,我總結如下幾個重要的要點:1. 不使用順序查詢,因為順序查詢比較慢,通過特定資料結構的特點來提升查詢速度,這

分頁優化+表鎖庫存優化+數據庫的備份導入

應對 value 概念 參考 char int 讓我 博客 打開 一.分頁優化技術 代碼參看: php/classic.php 把50331651記錄進行分頁,每頁顯示2條記錄,於是我們用傳統php編碼方式,編寫分頁代碼如下: 上傳到/var/www/html下進行

EntityFramework優化第一次啟動優化

n) star span .com error href start ica 控制 1. 預先生成視圖   通過代碼的方式來預先生成視圖,要求EntityFramework是6.0及以上版本。   控制臺程序: using System.Data.Entity.I

Hadoop生態圈-hive優化手段-作業查詢優化

spa 轉載 -s 責任 font 版權 pan 法律 ont                   Hadoop生態圈-hive優化手段-作業和查詢優化                                             作者:尹正傑 版權聲明:原創作品

Vue專案實戰優化已有元件優化系列(一)

一_原有元件效果 其中,核取方塊為一個元件,根據資料庫中的值,進行是否勾選,並且核取方塊只能是禁用的 二_原有元件程式碼 <template> <input v-if="gearboxtype === 'A'" checked type="

mysql語句 execute、executeQueryexecuteUpdate之間的區別

execute、executeQuery和executeUpdate之間的區別 JDBC中Statement 介面提供了三種執行 SQL 語句的方法:executeQuery、executeUpdate 和 execute。使用哪一個方法由 SQL 語句所產生的內容決定。

MySQL儲存引擎MyISAMInnoDB區別詳解

1、MyISAM和InnoDB區別 1.1 區別   InnoDB MyISAM 構造 由.frm檔案、表空間(分為獨立表空間或者共享表空間)和日誌檔案(redo log)組成。 MyIS

CDH 配置Mysql高可用主從keepalived

問題描述:配置CDH 配置Mysql高可用,並實現和cdh無縫對接。 主從和keepalived配置步驟:網上很多,這裡就不多贅述了!   配置常用命令: 查詢mysql連線使用的是那臺伺服器: show variables like "%hostname%"; s

MySql語句:增刪改查聯表查

由於測試需要,不符合邏輯的建兩張表,表內容如下: user表:userid,name,age; inClass表示:userid,className;表示該id所在的班級資訊 基本操作:建表、增刪改插 建表: -- CREATE table InClass( -- userid

MySQL儲存引擎InnoDBMyISAM的差別/優劣評價/評測/效能測試

$name = "heiyeluren"; $content = "MySQL支援數個儲存引擎作為對不同表的型別的處理器。MySQL儲存引擎包括處理事務安全表的引擎和處理非事務安全表的引擎:· MyISAM管理非事務表。它提供高速儲存和檢索,以及全文搜尋能力。MyISAM在所有MySQL配置裡被支援,它是預設

Mysql 語句之group by, having, count

Mysql的group by, having, count 平時經常用錯,這裡舉一些使用的例子。 group by having 聚合函式count,avg,min,max,sum等 group by 根據by後面的欄位的值分組,值相

MySQL儲存引擎MyISAMInnoDB的區別

### MyISAM和InnoDB的區別 #### 定義 **InnoDB**:MySQL預設的事務型引擎,也是最重要和使用最廣泛的儲存引擎。它被設計成為大量的短期事務,短期事務大部分情況下是正常提交的,很少被回滾。InnoDB的效能與自動崩潰恢復的特性,使得它在非事務儲存需求中也很流行。除非有非常特別的

第十九篇Mysql兩次Group byip轉數字作比較的一次優化

業務場景:兩張表,ipconfig_group表存了單位和 ip 起始段資訊visit_info表儲存了訪問次數,失敗次數,訪問流量,使用者ip等資訊兩張表的關係為:    一個部門下有若干ip段,對應的下面表的visitorip,每個visitorip有訪問次數,失敗

DB-MySQLMySQL 語句效能優化

ylbtech-DB-MySQL:MySQL 語句效能優化   1.返回頂部 1、 MySQL概述1.資料庫設計 3正規化2.資料庫分表分庫---會員系統() 水平分割(分頁如何查詢)MyCha