1 简介
mysql除可使用select查询表中的数据,也可使用handler语句,这条语句使我们能够一行一行的浏览一个表中的数据,不过handler语句并不具备select语句的所有功能。它是mysql专用的语句,并没有包含到SQL标准中。
HANDLER语句提供通往表的直接通道的存储引擎接口,可以用于MyISAM和InnoDB表。
2 基本语法
handler语句的语法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | HANDLER tbl_name OPEN [ [AS] alias] HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...) [ WHERE where_condition ] [LIMIT ... ] HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST } [ WHERE where_condition ] [LIMIT ... ] HANDLER tbl_name READ { FIRST | NEXT } [ WHERE where_condition ] [LIMIT ... ] HANDLER tbl_name CLOSE 通过HANDLER tbl_name OPEN打开一张表,无返回结果,实际上我们在这里声明了一个名为tb1_name的句柄。 通过HANDLER tbl_name READ FIRST获取句柄的第一行,通过READ NEXT依次获取其它行。最后一行执行之后再执行NEXT会返回一个空的结果。 通过HANDLER tbl_name CLOSE来关闭打开的句柄。 通过索引去查看的话可以按照一定的顺序,获取表中的数据。 通过HANDLER tbl_name READ index_name FIRST,获取句柄第一行(索引最小的一行),NEXT获取下一行,PREV获取前一行,LAST获取最后一行(索引最大的一行)。 通过索引列指定一个值,可以指定从哪一行开始。 通过HANDLER tbl_name READ index_name = value,指定从哪一行开始,通过NEXT继续浏览。 |
3 实例分析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 | 3.1 创建测试表及测试数据 create table handler_table( c1 int, c2 varchar(10), c3 int(10) ); insert into handler_table values(2, 'name2', 002); insert into handler_table values(5, 'name5', 005); insert into handler_table values(1, 'name1', 001); insert into handler_table values(4, 'name4', 004); insert into handler_table values(3, 'name3', 003); 3.2 不通过索引打开查看表 打开句柄: mysql> handler handler_table open; 查看表数据: mysql> handler handler_table read first; +------+-------+------+ | c1 | c2 | c3 | +------+-------+------+ | 2 | name2 | 2 | +------+-------+------+ mysql> handler handler_table read next; +------+-------+------+ | c1 | c2 | c3 | +------+-------+------+ | 5 | name5 | 5 | +------+-------+------+ mysql> handler handler_table read next; +------+-------+------+ | c1 | c2 | c3 | +------+-------+------+ | 1 | name1 | 1 | +------+-------+------+ mysql> handler handler_table read next; +------+-------+------+ | c1 | c2 | c3 | +------+-------+------+ | 4 | name4 | 4 | +------+-------+------+ mysql> handler handler_table read next; +------+-------+------+ | c1 | c2 | c3 | +------+-------+------+ | 3 | name3 | 3 | +------+-------+------+ mysql> handler handler_table read next; Empty set (0.00 sec) 关闭句柄: mysql> handler handler_table close; Query OK, 0 rows affected (0.00 sec) 3.3 通过索引打开查看表(FIRST,NEXT,PREV,LAST) 通过索引查看的话,可以按照索引的升序,从小到大,查看表信息。 创建索引: mysql> create index handler_index on handler_table(c1); 打开句柄: mysql> handler handler_table open as p; 查看表数据: mysql> handler p read handler_index first; +------+-------+------+ | c1 | c2 | c3 | +------+-------+------+ | 1 | name1 | 1 | +------+-------+------+ mysql> handler p read handler_index next; +------+-------+------+ | c1 | c2 | c3 | +------+-------+------+ | 2 | name2 | 2 | +------+-------+------+ mysql> handler p read handler_index next; +------+-------+------+ | c1 | c2 | c3 | +------+-------+------+ | 3 | name3 | 3 | +------+-------+------+ mysql> handler p read handler_index next; +------+-------+------+ | c1 | c2 | c3 | +------+-------+------+ | 4 | name4 | 4 | +------+-------+------+ mysql> handler p read handler_index next; +------+-------+------+ | c1 | c2 | c3 | +------+-------+------+ | 5 | name5 | 5 | +------+-------+------+ mysql> handler p read handler_index prev; +------+-------+------+ | c1 | c2 | c3 | +------+-------+------+ | 4 | name4 | 4 | +------+-------+------+ mysql> handler p read handler_index last; +------+-------+------+ | c1 | c2 | c3 | +------+-------+------+ | 5 | name5 | 5 | +------+-------+------+ 关闭句柄: mysql> handler p close; 3.4 通过索引打开查看表(=,<=,>=,<,>) 从index为2的地方开始 打开句柄: mysql> handler handler_table open as p; 查看表数据: mysql> handler p read handler_index = (2); +------+-------+------+ | c1 | c2 | c3 | +------+-------+------+ | 2 | name2 | 2 | +------+-------+------+ mysql> handler p read handler_index next; +------+-------+------+ | c1 | c2 | c3 | +------+-------+------+ | 3 | name3 | 3 | +------+-------+------+ mysql> handler p read handler_index next; +------+-------+------+ | c1 | c2 | c3 | +------+-------+------+ | 4 | name4 | 4 | +------+-------+------+ mysql> handler p read handler_index next; +------+-------+------+ | c1 | c2 | c3 | +------+-------+------+ | 5 | name5 | 5 | +------+-------+------+ mysql> handler p read handler_index last; +------+-------+------+ | c1 | c2 | c3 | +------+-------+------+ | 5 | name5 | 5 | +------+-------+------+ 关闭句柄: mysql> handler p close; 3.5 附加:语法实例参考 handler handler_table open; handler handler_table open as p; handler handler_table read first; handler handler_table read next; handler handler_table read first limit 3; handler handler_table read next limit 3,3; handler handler_table read first where c1 > 2 limit 2; handler handler_table read next where c1 >2 limit 1,2; create index handler_index on handler_table(c1); handler handler_table open; handler handler_table read handler_index first; handler handler_table read handler_index next limit 3; handler handler_table read handler_index PREV limit 3,3; handler handler_table read handler_index LAST where c1 > 2 limit 2; handler handler_table read handler_index LAST where c1 > 2 limit 1,2; handler handler_table read handler_index = (3); handler handler_table read handler_index <= (3) limit 2; handler handler_table read handler_index >= (3) limit 1,2; handler handler_table read handler_index < (4) where c1 > 0 limit 2; handler handler_table read handler_index > (1) where c1 < 6 limit 2,2; handler handler_table close; drop index handler_index on handler_table; |
4 handler与select的比较
1 2 3 4 | 4.1 select语句一次返回所有相关行,handler每次返回一行。 4.2 HANDLER涉及的分析较少,比SELECT更快 4.3 没有优化程序或查询校验开销 4.4 在两个管理程序请求之间,不需要锁定表。 |
5 注意事项
1 2 3 4 | 5.1 如果一个应用停止了,所有仍然打开的句柄将自动停止。 5.2 handler不支持分区表。 5.3 执行TRUNCATE TABLE会关闭所有在该表上打开的handler。 5.4 handler打开一个表时不锁表,也不对表进行快照,所以当表中数据实时更新时,handler将会失去指针的位置。 |
转载:https://www.cnblogs.com/taoyaostudy/p/13479367.html