基於MySQL自增ID欄位增量掃描研究

一見發表於2019-01-10

目錄

目錄 1

1. 問題 1

2. 背景 1

3. InnoDB表 2

3.1. 自增ID為主鍵 2

3.2. 自增ID為普通索引 4

3.3. 原因分析 7

4. MyISAM表 8

4.1. 自增ID為主鍵 8

4.2. 自增ID為普通索引 11

4.3. 原因分析 14

5. 研究結論 14

 

1. 問題

對於MySQL表,如果自增ID不是主鍵時,是否可以用來做增量查詢?

2. 背景

需要按照自增ID欄位進行增量查詢,有些表的自增ID是主鍵,而有些表的自增只是普通索引,有些採用MyISAM,有些採用InnoDB。

如果採用粗暴的“SELECT * FROM table WHERE f_id>M ORDER BY f_id LIMIT N”,功能上沒有任何問題,但當表的記錄數很大時(比如1000萬條),“ORDER BY f_id”會極影響查詢效率。為此,需要弄清楚“SELECT * FROM table WHERE f_id>M LIMIT N”的可行性,即增量查詢時,不指定“ORDER BY f_id”。

研究基於的MySQL(注:5.6.7之前最大分割槽數限制為1024,從5.6.7開始調整為8192,另外5.6版本分割槽表不支援HANDLER):

MySQL [test]> select version();

+-----------+

| version() |

+-----------+

5.7.18    |

+-----------+

1 row in set (0.01 sec)

3. InnoDB表

3.1. 自增ID為主鍵

建表SQL語句:

DROP TABLE IF EXISTS `tableA1`;

CREATE TABLE `tableA1` (

    `id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,

    `af` INT NOT NULL,

    `bf` INT NOT NULL,

    `cf` INT NOT NULL,

    INDEX `idx_af` (`af`),

    INDEX `idx_bf` (`bf`)

)ENGINE=InnoDB;

 

依順序執行下列插入操作:

INSERT INTO tableA1 (af,bf,cf) VALUES (1,2,1);

INSERT INTO tableA1 (af,bf,cf) VALUES (2,1,2);

INSERT INTO tableA1 (id,af,bf,cf) VALUES (11,12,11,11);

INSERT INTO tableA1 (id,af,bf,cf) VALUES (12,11,12,12);

INSERT INTO tableA1 (af,bf,cf) VALUES (13,16,13);

INSERT INTO tableA1 (id,af,bf,cf) VALUES (3,3,3,3);

INSERT INTO tableA1 (af,bf,cf) VALUES (14,17,14);

INSERT INTO tableA1 (id,af,bf,cf) VALUES (5,15,5,5);

 

檢視結果:

// 按自增ID有序(自增ID為主鍵)

MySQL [test]> SELECT * FROM tableA1;

+----+----+----+----+

| id | af | bf | cf |

+----+----+----+----+

|  1 |  1 |  2 |  1 |

|  2 |  2 |  1 |  2 |

|  3 |  3 |  3 |  3 |

|  5 | 15 |  5 |  5 |

11 | 12 | 11 | 11 |

| 12 | 11 | 12 | 12 |

13 | 13 | 16 | 13 |

| 14 | 14 | 17 | 14 |

+----+----+----+----+

8 rows in set (0.00 sec)

// 按自增ID有序(自增ID為主鍵)

MySQL [test]> SELECT * FROM tableA1 WHERE id>=1 LIMIT 10;

+----+----+----+----+

| id | af | bf | cf |

+----+----+----+----+

|  1 |  1 |  2 |  1 |

|  2 |  2 |  1 |  2 |

|  3 |  3 |  3 |  3 |

|  5 | 15 |  5 |  5 |

11 | 12 | 11 | 11 |

| 12 | 11 | 12 | 12 |

13 | 13 | 16 | 13 |

| 14 | 14 | 17 | 14 |

+----+----+----+----+

8 rows in set (0.00 sec)

 

// 按自增ID有序(自增ID為主鍵)

MySQL [test]> SELECT * FROM tableA1 WHERE id>=2 LIMIT 10; 

+----+----+----+----+

| id | af | bf | cf |

+----+----+----+----+

|  2 |  2 |  1 |  2 |

|  3 |  3 |  3 |  3 |

|  5 | 15 |  5 |  5 |

| 11 | 12 | 11 | 11 |

12 | 11 | 12 | 12 |

| 13 | 13 | 16 | 13 |

14 | 14 | 17 | 14 |

+----+----+----+----+

7 rows in set (0.00 sec)

 

// 按自增ID有序(自增ID為主鍵)

MySQL [test]> SELECT * FROM tableA1 WHERE id>=2 LIMIT 7;

+----+----+----+----+

| id | af | bf | cf |

+----+----+----+----+

|  2 |  2 |  1 |  2 |

|  3 |  3 |  3 |  3 |

|  5 | 15 |  5 |  5 |

| 11 | 12 | 11 | 11 |

12 | 11 | 12 | 12 |

| 13 | 13 | 16 | 13 |

14 | 14 | 17 | 14 |

+----+----+----+----+

7 rows in set (0.00 sec)

 

可以看到,當自增ID為主鍵時,自增ID亂序插入,查詢結果也是按自增ID有序(實測有序插入一樣有序),因此可以放心依自增ID增量查詢,而不必指定“ORDER BY f_id”。

3.2. 自增ID為普通索引

DROP TABLE IF EXISTS `tableA2`;

CREATE TABLE `tableA2` (

    `id` BIGINT NOT NULL AUTO_INCREMENT,

    `af` INT NOT NULL,

    `bf` INT NOT NULL,

    `cf` INT NOT NULL,

    UNIQUE INDEX `idx_af` (`af`),

    INDEX `idx_id` (`id`),

    INDEX `idx_bf` (`bf`)

)ENGINE=InnoDB;

 

依順序執行下列插入操作:

INSERT INTO tableA2 (af,bf,cf) VALUES (1,2,1);

INSERT INTO tableA2 (af,bf,cf) VALUES (2,1,2);

INSERT INTO tableA2 (id,af,bf,cf) VALUES (11,12,11,11);

INSERT INTO tableA2 (id,af,bf,cf) VALUES (12,11,12,12);

INSERT INTO tableA2 (af,bf,cf) VALUES (13,16,13);

INSERT INTO tableA2 (id,af,bf,cf) VALUES (3,3,3,3);

INSERT INTO tableA2 (af,bf,cf) VALUES (14,17,14);

INSERT INTO tableA2 (id,af,bf,cf) VALUES (5,15,5,5);

 

檢視結果:

// 總共8條記錄

MySQL [test]> SELECT COUNT(1) FROM tableA2;

+----------+

| COUNT(1) |

+----------+

|        8 |

+----------+

1 row in set (0.00 sec)

 

// 按自增ID無序,但按唯一索引有序

MySQL [test]> SELECT * FROM tableA2;

+----+----+----+----+

| id | af | bf | cf |

+----+----+----+----+

|  1 |  1 |  2 |  1 |

|  2 |  2 |  1 |  2 |

|  3 |  3 |  3 |  3 |

| 12 | 11 | 12 | 12 |

| 11 | 12 | 11 | 11 |

| 13 | 13 | 16 | 13 |

| 14 | 14 | 17 | 14 |

|  5 | 15 |  5 |  5 |

+----+----+----+----+

8 rows in set (0.00 sec)

 

// 按自增ID無序,但按唯一索引有序

MySQL [test]> SELECT * FROM tableA2 WHERE id>=1 LIMIT 10;

+----+----+----+----+

| id | af | bf | cf |

+----+----+----+----+

|  1 |  1 |  2 |  1 |

|  2 |  2 |  1 |  2 |

|  3 |  3 |  3 |  3 |

| 12 | 11 | 12 | 12 |

| 11 | 12 | 11 | 11 |

| 13 | 13 | 16 | 13 |

| 14 | 14 | 17 | 14 |

|  5 | 15 |  5 |  5 |

+----+----+----+----+

8 rows in set (0.00 sec)

 

// 按自增ID無序,但按唯一索引有序

MySQL [test]> SELECT * FROM tableA2 WHERE id>=2 LIMIT 10;

+----+----+----+----+

| id | af | bf | cf |

+----+----+----+----+

|  2 |  2 |  1 |  2 |

|  3 |  3 |  3 |  3 |

| 12 | 11 | 12 | 12 |

| 11 | 12 | 11 | 11 |

| 13 | 13 | 16 | 13 |

| 14 | 14 | 17 | 14 |

|  5 | 15 |  5 |  5 |

+----+----+----+----+

7 rows in set (0.00 sec)

 

// 按自增ID有序,但按唯一索引無序(LIMIT數小於表總記錄數)

MySQL [test]> SELECT * FROM tableA2 WHERE id>=2 LIMIT 5;

+----+----+----+----+

| id | af | bf | cf |

+----+----+----+----+

|  2 |  2 |  1 |  2 |

|  3 |  3 |  3 |  3 |

|  5 | 15 |  5 |  5 |

| 11 | 12 | 11 | 11 |

12 | 11 | 12 | 12 |

+----+----+----+----+

5 rows in set (0.00 sec)

 

// 按自增ID有序,但按唯一索引無序(LIMIT數小於表總記錄數)

MySQL [test]> SELECT * FROM tableA2 WHERE id>=1 LIMIT 7;

+----+----+----+----+

| id | af | bf | cf |

+----+----+----+----+

|  1 |  1 |  2 |  1 |

|  2 |  2 |  1 |  2 |

|  3 |  3 |  3 |  3 |

|  5 | 15 |  5 |  5 |

11 | 12 | 11 | 11 |

| 12 | 11 | 12 | 12 |

13 | 13 | 16 | 13 |

+----+----+----+----+

7 rows in set (0.00 sec)

 

// 更新一條記錄

MySQL [test]> UPDATE tableA2 SET id=15 WHERE id=12;

Query OK, 1 row affected (0.00 sec)

Rows matched: 1  Changed: 1  Warnings: 0

 

// 按自增ID是無序的

MySQL [test]> SELECT * FROM tableA2  LIMIT 7;

+----+----+----+----+

| id | af | bf | cf |

+----+----+----+----+

|  1 |  1 |  2 |  1 |

|  2 |  2 |  1 |  2 |

|  3 |  3 |  3 |  3 |

| 15 | 11 | 12 | 12 |

| 11 | 12 | 11 | 11 |

| 13 | 13 | 16 | 13 |

| 14 | 14 | 17 | 14 |

+----+----+----+----+

7 rows in set (0.00 sec)

// 按自增ID是有序的(LIMIT數小於表記錄數)

// 按唯一自增ID無序

MySQL [test]> SELECT * FROM tableA2 WHERE id>=1 LIMIT 7;

+----+----+----+----+

| id | af | bf | cf |

+----+----+----+----+

|  1 |  1 |  2 |  1 |

|  2 |  2 |  1 |  2 |

|  3 |  3 |  3 |  3 |

|  5 | 15 |  5 |  5 |

11 | 12 | 11 | 11 |

| 13 | 13 | 16 | 13 |

14 | 14 | 17 | 14 |

+----+----+----+----+

7 rows in set (0.00 sec)

 

// 按自增ID是無序的(LIMIT數等於或大於表記錄數)

// 按唯一自增ID有序

MySQL [test]> SELECT * FROM tableA2 WHERE id>=1 LIMIT 8;

+----+----+----+----+

| id | af | bf | cf |

+----+----+----+----+

|  1 |  1 |  2 |  1 |

|  2 |  2 |  1 |  2 |

|  3 |  3 |  3 |  3 |

| 15 | 11 | 12 | 12 |

11 | 12 | 11 | 11 |

| 13 | 13 | 16 | 13 |

14 | 14 | 17 | 14 |

|  5 | 15 |  5 |  5 |

+----+----+----+----+

8 rows in set (0.00 sec)

 

從測試可以看到,當LIMIT的數小於表的記錄數時,結果是按自增ID有序返回。

3.3. 原因分析

InnoDB儲存資料時,即按B+樹結果儲存,B+樹的葉子結果儲存完整的記錄,表檔案本身即為主索引(即主鍵),普通索引並不直接指向資料,而是指向了主索引。

如對於表tableA2(tableA1結果相同):

INSERT INTO tableA2 (id,af,bf,cf) VALUES (1,1,1,1);

INSERT INTO tableA2 (id,af,bf,cf) VALUES (2,5,1,1);

INSERT INTO tableA2 (id,af,bf,cf) VALUES (3,2,1,1);

INSERT INTO tableA2 (id,af,bf,cf) VALUES (4,8,1,1);

INSERT INTO tableA2 (id,af,bf,cf) VALUES (5,3,1,1);

INSERT INTO tableA2 (id,af,bf,cf) VALUES (6,4,1,1);

INSERT INTO tableA2 (id,af,bf,cf) VALUES (7,7,1,1);

 

MySQL [test]> SELECT * FROM tableA2 WHERE af>0 LIMIT 3;

+----+----+----+----+

| id | af | bf | cf |

+----+----+----+----+

|  1 |  1 |  1 |  1 |

|  3 |  2 |  1 |  1 |

|  5 |  3 |  1 |  1 |

+----+----+----+----+

3 rows in set (0.00 sec)

 

MySQL [test]> SELECT * FROM tableA2 WHERE af>0 LIMIT 10;

+----+----+----+----+

| id | af | bf | cf |

+----+----+----+----+

|  1 |  1 |  1 |  1 |

|  3 |  2 |  1 |  1 |

|  5 |  3 |  1 |  1 |

|  6 |  4 |  1 |  1 |

|  2 |  5 |  1 |  1 |

|  7 |  7 |  1 |  1 |

|  4 |  8 |  1 |  1 |

+----+----+----+----+

7 rows in set (0.00 sec)

4. MyISAM表

4.1. 自增ID為主鍵

建表SQL語句:

DROP TABLE IF EXISTS `tableB1`;

CREATE TABLE `tableB1` (

    `id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,

    `af` INT NOT NULL,

    `bf` INT NOT NULL,

    `cf` INT NOT NULL,

    INDEX `idx_id` (`id`),

    INDEX `idx_bf` (`bf`)

)ENGINE=MyISAM;

 

依順序執行下列插入操作:

INSERT INTO tableB1 (af,bf,cf) VALUES (1,2,1);

INSERT INTO tableB1 (af,bf,cf) VALUES (2,1,2);

INSERT INTO tableB1 (id,af,bf,cf) VALUES (11,12,11,11);

INSERT INTO tableB1 (id,af,bf,cf) VALUES (12,11,12,12);

INSERT INTO tableB1 (af,bf,cf) VALUES (13,16,13);

INSERT INTO tableB1 (id,af,bf,cf) VALUES (3,3,3,3);

INSERT INTO tableB1 (af,bf,cf) VALUES (14,17,14);

INSERT INTO tableB1 (id,af,bf,cf) VALUES (5,15,5,5);

 

檢視結果:

// 亂序

MySQL [test]> SELECT * FROM tableB1;

+----+----+----+----+

| id | af | bf | cf |

+----+----+----+----+

|  1 |  1 |  1 |  1 |

|  2 |  2 |  2 |  2 |

| 11 | 11 | 11 | 11 |

| 12 | 12 | 12 | 12 |

| 13 | 13 | 13 | 13 |

|  3 |  3 |  3 |  3 |

| 14 | 14 | 14 | 14 |

|  5 |  5 |  5 |  5 |

+----+----+----+----+

8 rows in set (0.00 sec)

 

// 亂序了

MySQL [test]> SELECT * FROM tableB1 WHERE id>1 LIMIT 10;

+----+----+----+----+

| id | af | bf | cf |

+----+----+----+----+

|  2 |  2 |  2 |  2 |

| 11 | 11 | 11 | 11 |

| 12 | 12 | 12 | 12 |

| 13 | 13 | 13 | 13 |

|  3 |  3 |  3 |  3 |

| 14 | 14 | 14 | 14 |

|  5 |  5 |  5 |  5 |

+----+----+----+----+

7 rows in set (0.00 sec)

 

可以看到,結果並不是按自增ID有序,但是否意味著不能用來做增量查詢了?繼續看下面的操作:

MySQL [test]> SELECT COUNT(1) FROM tableB1;

+----------+

| COUNT(1) |

+----------+

|        8 |

+----------+

1 row in set (0.00 sec)

 

MySQL [test]> SELECT * FROM tableB1 WHERE id>0 LIMIT 3;

+----+----+----+----+

| id | af | bf | cf |

+----+----+----+----+

|  1 |  1 |  1 |  1 |

|  2 |  2 |  2 |  2 |

|  3 |  3 |  3 |  3 |

+----+----+----+----+

3 rows in set (0.01 sec)

 

// 未亂序

MySQL [test]> SELECT * FROM tableB1 WHERE id>0 LIMIT 7;

+----+----+----+----+

| id | af | bf | cf |

+----+----+----+----+

|  1 |  1 |  1 |  1 |

|  2 |  2 |  2 |  2 |

|  3 |  3 |  3 |  3 |

|  5 |  5 |  5 |  5 |

| 11 | 11 | 11 | 11 |

| 12 | 12 | 12 | 12 |

| 13 | 13 | 13 | 13 |

+----+----+----+----+

7 rows in set (0.00 sec)

 

// 亂序

MySQL [test]> SELECT * FROM tableB1 WHERE id>0 LIMIT 8;

+----+----+----+----+

| id | af | bf | cf |

+----+----+----+----+

|  1 |  1 |  1 |  1 |

|  2 |  2 |  2 |  2 |

| 11 | 11 | 11 | 11 |

| 12 | 12 | 12 | 12 |

| 13 | 13 | 13 | 13 |

|  3 |  3 |  3 |  3 |

| 14 | 14 | 14 | 14 |

|  5 |  5 |  5 |  5 |

+----+----+----+----+

8 rows in set (0.00 sec)

 

MySQL [jay_data]> SELECT * FROM tableB1 WHERE id>6 LIMIT 3; 

+----+----+----+----+

| id | af | bf | cf |

+----+----+----+----+

| 11 | 11 | 11 | 11 |

| 12 | 12 | 12 | 12 |

| 13 | 13 | 13 | 13 |

+----+----+----+----+

3 rows in set (0.01 sec)

 

MySQL [jay_data]> SELECT * FROM tableB1 WHERE id>8 LIMIT 3; 

+----+----+----+----+

| id | af | bf | cf |

+----+----+----+----+

| 11 | 11 | 11 | 11 |

| 12 | 12 | 12 | 12 |

| 13 | 13 | 13 | 13 |

+----+----+----+----+

3 rows in set (0.00 sec)

 

這裡發生了有趣的事,如果LIMIT指定的數小於表實際的記錄數,則仍然是按ID有序,否則是ID是亂序的。但是實際遇到:即使LIMIT指定的數小於表實際的記錄數,也會返回亂序的結果。

4.2. 自增ID為普通索引

建表SQL語句:

DROP TABLE IF EXISTS `tableB2`;

CREATE TABLE `tableB2` (

    `id` BIGINT NOT NULL AUTO_INCREMENT,

    `af` INT NOT NULL,

    `bf` INT NOT NULL,

    `cf` INT NOT NULL,

    UNIQUE INDEX `idx_af` (`af`),

    INDEX `idx_id` (`id`),

    INDEX `idx_bf` (`bf`)

)ENGINE=MyISAM;

 

依順序執行下列插入操作:

INSERT INTO tableB2 (af,bf,cf) VALUES (1,2,1);

INSERT INTO tableB2 (af,bf,cf) VALUES (2,1,2);

INSERT INTO tableB2 (id,af,bf,cf) VALUES (11,12,11,11);

INSERT INTO tableB2 (id,af,bf,cf) VALUES (12,11,12,12);

INSERT INTO tableB2 (af,bf,cf) VALUES (13,16,13);

INSERT INTO tableB2 (id,af,bf,cf) VALUES (3,3,3,3);

INSERT INTO tableB2 (af,bf,cf) VALUES (14,17,14);

INSERT INTO tableB2 (id,af,bf,cf) VALUES (5,15,5,5);

 

檢視結果:

// 亂序

MySQL [test]> SELECT * FROM tableB2;

+----+----+----+----+

| id | af | bf | cf |

+----+----+----+----+

|  1 |  1 |  1 |  1 |

|  2 |  2 |  2 |  2 |

| 11 | 11 | 11 | 11 |

| 12 | 12 | 12 | 12 |

| 13 | 13 | 13 | 13 |

|  3 |  3 |  3 |  3 |

| 14 | 14 | 14 | 14 |

|  5 |  5 |  5 |  5 |

+----+----+----+----+

8 rows in set (0.00 sec)

 

自增ID不影響查詢結果的順序,繼續看下面的操作:

MySQL [test]> SELECT COUNT(1) FROM tableB2;

+----------+

| COUNT(1) |

+----------+

|        8 |

+----------+

1 row in set (0.01 sec)

 

MySQL [test]> SELECT * FROM tableB2 WHERE id>0 LIMIT 3; 

+----+----+----+----+

| id | af | bf | cf |

+----+----+----+----+

|  1 |  1 |  1 |  1 |

|  2 |  2 |  2 |  2 |

|  3 |  3 |  3 |  3 |

+----+----+----+----+

3 rows in set (0.00 sec)

 

// 未亂序

MySQL [test]> SELECT * FROM tableB2 WHERE id>0 LIMIT 7;

+----+----+----+----+

| id | af | bf | cf |

+----+----+----+----+

|  1 |  1 |  1 |  1 |

|  2 |  2 |  2 |  2 |

|  3 |  3 |  3 |  3 |

|  5 |  5 |  5 |  5 |

| 11 | 11 | 11 | 11 |

| 12 | 12 | 12 | 12 |

| 13 | 13 | 13 | 13 |

+----+----+----+----+

7 rows in set (0.00 sec)

 

// 亂序

MySQL [test]> SELECT * FROM tableB2 WHERE id>0 LIMIT 8;

+----+----+----+----+

| id | af | bf | cf |

+----+----+----+----+

|  1 |  1 |  1 |  1 |

|  2 |  2 |  2 |  2 |

| 11 | 11 | 11 | 11 |

| 12 | 12 | 12 | 12 |

| 13 | 13 | 13 | 13 |

|  3 |  3 |  3 |  3 |

| 14 | 14 | 14 | 14 |

|  5 |  5 |  5 |  5 |

+----+----+----+----+

8 rows in set (0.00 sec)

 

MySQL [jay_data]> SELECT * FROM tableB2 WHERE id>6 LIMIT 3;

+----+----+----+----+

| id | af | bf | cf |

+----+----+----+----+

| 11 | 11 | 11 | 11 |

| 12 | 12 | 12 | 12 |

| 13 | 13 | 13 | 13 |

+----+----+----+----+

3 rows in set (0.01 sec)

 

MySQL [jay_data]> SELECT * FROM tableB2 WHERE id>8 LIMIT 3; 

+----+----+----+----+

| id | af | bf | cf |

+----+----+----+----+

| 11 | 11 | 11 | 11 |

| 12 | 12 | 12 | 12 |

| 13 | 13 | 13 | 13 |

+----+----+----+----+

3 rows in set (0.00 sec)

 

現象和自增ID為主鍵時完全相同。

4.3. 原因分析

MyISAM的索引也是B+樹結構,但索引檔案和資料檔案分開儲存在不同檔案。如果LIMIT的值達到或超過表的總記錄數,則查詢直接掃描資料檔案,因此如果不指定“ORDER BY f_id”,則返回結果和插入順序一致。但如果LIMIT的值小於表的總記錄數,則和InnoDB一樣掃描索引,因此可以不指定“ORDER BY f_id”。MyISAM的主鍵(主索引)和普通索引沒有本質區別,只是主鍵有唯一性約束,而普通索引可重複。

5. 研究結論

實際情況會更復雜,比如有修改有刪除,這些都需要是一步測試,甚至可能和版本相關。即使是聚集索引,不指定“ORDER BY f_id”,也沒法保證順序。如果對資料沒有嚴格的要求,可以考慮不指定“ORDER BY f_id”,但如果必須不多不少,則必須帶上“ORDER BY f_id”,不管是InnoDB還是MyISAM,也不管自增ID是主鍵還是非主鍵。但是對於一張大表,加上“ORDER BY f_id”後的查詢效能可能降低一個甚至更多數量級。謹記:MySQL沒有預設順序這個概念。

在使用“ORDER BY f_id”時,請指定f_id的上下限,這樣能夠保證較好的效能,比如:“WHERE f_id>=N AND f_id<=M”,否則如果只有上限或下限,效能可能會受到很大影響,建議用EXPLAIN瞭解詳情

如果實在不想用ORDER BY f_id”,還可以考慮如下方式(query可能返回空可能是掃描完了,也可能是該段是空隙無資料):

const int step = 1000;

while (true)

{

  const std::string& sql =

    format_string(

      "SELECT f_id,f_a,f_b,f_c,f_d FROM table "

      "WHERE f_id BETWEEN %u AND (%u+step)",

      id, id);

  mysql.query(sql);

  id += step + 1;

}

相關文章