|
不过效率还是没有存储过程来的高
我的测试结果:
mysql> CREATE TABLE `t` (
-> `id` int(11) NOT NULL auto_increment,
-> `g_id` int(11) NOT NULL,
-> `t_str` varchar(255) NOT NULL,
-> PRIMARY KEY (`id`)
-> ) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.03 sec)
mysql>
mysql> /*Data for the table `t` */
mysql>
mysql> insert into `t`(`id`,`g_id`,`t_str`) values (1,2,'wo'),(2,2,'ni'),(3,2,'ta'),(4,3,'wo '),(5,4,'ni'),(6,3,'ni'),(7,4,'ta'),(8,3,'wang'),(9,4,'li'),(10,3,'hai'),(11,4,'ri'),(12,2,'ren'),(13,5,'ta'),(14,6,'ri'),(15,6,'ren'),(16,6,'fuck'),(17,6,'shit'),(18,5,'ls'),(19,5,'chmod'),(20,5,'chgrp'),(21,5,'chown'),(22,3,'rm'),(23,3,'desc'),(24,4,'pwd'),(25,5,'cd');
Query OK, 25 rows affected (0.00 sec)
Records: 25 Duplicates: 0 Warnings: 0
mysql> create index f_g_id on t(g_id);
Query OK, 25 rows affected (0.04 sec)
Records: 25 Duplicates: 0 Warnings: 0
mysql> desc t;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| g_id | int(11) | NO | MUL | | |
| t_str | varchar(255) | NO | | | |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
mysql> select * from t;
+----+------+-------+
| id | g_id | t_str |
+----+------+-------+
| 1 | 2 | wo |
| 2 | 2 | ni |
| 3 | 2 | ta |
| 4 | 3 | wo |
| 5 | 4 | ni |
| 6 | 3 | ni |
| 7 | 4 | ta |
| 8 | 3 | wang |
| 9 | 4 | li |
| 10 | 3 | hai |
| 11 | 4 | ri |
| 12 | 2 | ren |
| 13 | 5 | ta |
| 14 | 6 | ri |
| 15 | 6 | ren |
| 16 | 6 | fuck |
| 17 | 6 | shit |
| 18 | 5 | ls |
| 19 | 5 | chmod |
| 20 | 5 | chgrp |
| 21 | 5 | chown |
| 22 | 3 | rm |
| 23 | 3 | desc |
| 24 | 4 | pwd |
| 25 | 5 | cd |
+----+------+-------+
25 rows in set (0.00 sec)
mysql> SELECT a.* FROM t a WHERE
-> (
-> SELECT COUNT(*) FROM t b WHERE a.g_id = b.g_id AND b.id<a.id
-> ) < 2 ORDER BY a.g_id DESC;
+----+------+-------+
| id | g_id | t_str |
+----+------+-------+
| 15 | 6 | ren |
| 14 | 6 | ri |
| 18 | 5 | ls |
| 13 | 5 | ta |
| 7 | 4 | ta |
| 5 | 4 | ni |
| 6 | 3 | ni |
| 4 | 3 | wo |
| 2 | 2 | ni |
| 1 | 2 | wo |
+----+------+-------+
10 rows in set (0.04 sec)
mysql>
mysql> explain SELECT a.* FROM t a WHERE
-> (
-> SELECT COUNT(*) FROM t b WHERE a.g_id = b.g_id AND b.id<a.id
-> ) < 2 ORDER BY a.g_id DESC\G
*************************** 1. row ***************************
id: 1
select_type: PRIMARY
table: a
type: index
possible_keys: NULL
key: f_g_id
key_len: 4
ref: NULL
rows: 25
Extra: Using where
*************************** 2. row ***************************
id: 2
select_type: DEPENDENT SUBQUERY
table: b
type: ref
possible_keys: PRIMARY,f_g_id
key: f_g_id
key_len: 4
ref: test.a.g_id
rows: 2
Extra: Using where; Using index
2 rows in set (0.00 sec) |
|