mysql内存表弊端

<script src="http://v2.jiathis.com/code/jia.js" type="text/javascript"></script><!-- JiaThis Button END -->

内存表的也不是提高读性能的万能工具,在有些情况下,可能会比其实表类型的B-TREE更慢
CREATE TABLE `mem_test` (                                                            
            `id` int(10) unsigned NOT NULL DEFAULT '0',                                         
            `name` varchar(10) DEFAULT NULL,                                                   
            `first` varchar(10) DEFAULT NULL,                                                   
            PRIMARY KEY (`id`),                                                                 
            KEY `NewIndex1` (`name`,`first`)                                                   
          ) ENGINE=MEMORY ;

CREATE TABLE `innodb_test` (                  
               `id` int(10) unsigned NOT NULL DEFAULT '0',
               `name` varchar(10) DEFAULT NULL,            
               `first` varchar(10) DEFAULT NULL,            
               PRIMARY KEY (`id`),                          
               KEY `NewIndex1` (`name`,`first`)            
             ) ENGINE=InnoDB;

如:
1:在= 或者<=> 情况下,飞快,但是在如< 或>情况下,他是不使用索引
mysql--root@localhost:17db 07:33:45>>explain select * from mem_test where id>3;
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table    | type | possible_keys | key | key_len | ref | rows | Extra       |
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE      | mem_test | ALL | PRIMARY       | NULL | NULL    | NULL |   15 | Using where |
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

mysql--root@localhost:17db 07:33:49>>explain select * from innodb_test where id>3;
+----+-------------+-------------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table       | type | possible_keys | key     | key_len | ref | rows | Extra       |
+----+-------------+-------------+-------+---------------+---------+---------+------+------+-------------+
| 1 | SIMPLE      | innodb_test | range | PRIMARY       | PRIMARY | 4       | NULL |    7 | Using where |
+----+-------------+-------------+-------+---------------+---------+---------+------+------+-------------+
1 row in set (0.00 sec)

2:不能用在order by情况下来提高速度
mysql--root@localhost:17db 07:33:55>>explain select * from innodb_test order by id;
+----+-------------+-------------+-------+---------------+---------+---------+------+------+-------+
| id | select_type | table       | type | possible_keys | key     | key_len | ref | rows | Extra |
+----+-------------+-------------+-------+---------------+---------+---------+------+------+-------+
| 1 | SIMPLE      | innodb_test | index | NULL          | PRIMARY | 4       | NULL |   15 |       |
+----+-------------+-------------+-------+---------------+---------+---------+------+------+-------+
1 row in set (0.00 sec)

mysql--root@localhost:17db 07:34:27>>explain select * from mem_test order by id;
+----+-------------+----------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table    | type | possible_keys | key | key_len | ref | rows | Extra          |
+----+-------------+----------+------+---------------+------+---------+------+------+----------------+
| 1 | SIMPLE      | mem_test | ALL | NULL          | NULL | NULL    | NULL |   15 | Using filesort |
+----+-------------+----------+------+---------------+------+---------+------+------+----------------+
1 row in set (0.00 sec)

3:不能确定俩值之间有多少行
mysql--root@localhost:17db 07:37:14>>explain select count(1) from mem_test where id>3 and id<6;
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table    | type | possible_keys | key | key_len | ref | rows | Extra       |
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE      | mem_test | ALL | PRIMARY       | NULL | NULL    | NULL |   20 | Using where |
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

mysql--root@localhost:17db 07:40:35>>explain select count(1) from innodb_test where id>3 and id<6;
+----+-------------+-------------+-------+---------------+---------+---------+------+------+--------------------------+
| id | select_type | table       | type | possible_keys | key     | key_len | ref | rows | Extra                    |
+----+-------------+-------------+-------+---------------+---------+---------+------+------+--------------------------+
| 1 | SIMPLE      | innodb_test | range | PRIMARY       | PRIMARY | 4       | NULL |    1 | Using where; Using index |
+----+-------------+-------------+-------+---------------+---------+---------+------+------+--------------------------+
1 row in set (0.00 sec)

4:在多列索引的情况下,只有全部指定才能利用hash扫描,而B-tree确可以利用索引的最左端来查找
mysql--root@localhost:17db 07:37:07>>explain select * from innodb_test where name='b';
+----+-------------+-------------+------+---------------+-----------+---------+-------+------+--------------------------+
| id | select_type | table       | type | possible_keys | key       | key_len | ref   | rows | Extra                    |
+----+-------------+-------------+------+---------------+-----------+---------+-------+------+--------------------------+
| 1 | SIMPLE      | innodb_test | ref | NewIndex1     | NewIndex1 | 33      | const |    8 | Using where; Using index |
+----+-------------+-------------+------+---------------+-----------+---------+-------+------+--------------------------+
1 row in set (0.00 sec)

mysql--root@localhost:17db 07:37:10>>explain select * from mem_test where name='b';
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table    | type | possible_keys | key | key_len | ref | rows | Extra       |
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE      | mem_test | ALL | NewIndex1     | NULL | NULL    | NULL |   20 | Using where |
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
当然内存表也可以手动添加btree
CREATE INDEX BTREE_index USING BTREE on mem_test(name,first)
mysql--root@localhost:17db 03:36:41>>explain select * from mem_test where name='b';
+----+-------------+----------+------+-----------------------+-------------+---------+-------+------+-------------+
| id | select_type | table    | type | possible_keys         | key         | key_len | ref   | rows | Extra       |
+----+-------------+----------+------+-----------------------+-------------+---------+-------+------+-------------+
| 1 | SIMPLE      | mem_test | ref | NewIndex1,BTREE_index | BTREE_index | 33      | const |    9 | Using where |
+----+-------------+----------+------+-----------------------+-------------+---------+-------+------+-------------+
1 row in set (0.00 sec)
哈哈,它也用到索引了。
所以选择合适的存储引擎至关重要。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值