zoukankan      html  css  js  c++  java
  • MySQL内存表的弊端

     MySQL内存表使我们经常会用到的,但是 MySQL内存表的也不是提高读性能的万能工具,在有些情况下,MySQL内存表可能会比其实表类型的B-TREE更慢  。

    1. CREATE TABLE `mem_test` (                                                               
    2.             `idint(10) unsigned NOT NULL DEFAULT 0,                                           
    3.             `name` varchar(10) DEFAULT NULL,                                                      
    4.             `first` varchar(10) DEFAULT NULL,                                                     
    5.             PRIMARY KEY (`id`),                                                                   
    6.             KEY `NewIndex1` (`name`,`first`)                                                      
    7.           ) ENGINE=MEMORY ;  
    8.  
    9. CREATE TABLE `innodb_test` (                     
    10.                `id` int(10) unsigned NOT NULL DEFAULT 0,   
    11.                `name` varchar(10) DEFAULT NULL,               
    12.                `first` varchar(10) DEFAULT NULL,              
    13.                PRIMARY KEY (`id`),                            
    14.                KEY `NewIndex1` (`name`,`first`)               
    15.              ) ENGINE=InnoDB;  
    16.  

      如:
    1:在= 或者<=> 情况下,飞快,但是在如< 或>情况下,他是不使用索引

    1. mysql--root@localhost:17db 07:33:45>>explain select * from mem_test where id>3;  
    2. +----+-------------+----------+------+---------------+------+---------+------+------+-------------+  
    3. | id | select_type | table    | type | possible_keys | key | key_len | ref | rows | Extra       |  
    4. +----+-------------+----------+------+---------------+------+---------+------+------+-------------+  
    5. | 1 | SIMPLE      | mem_test | ALL | PRIMARY       | NULL | NULL    | NULL |   15 | Using where |  
    6. +----+-------------+----------+------+---------------+------+---------+------+------+-------------+  
    7. 1 row in set (0.00 sec)  
    8.  
    9. mysql--root@localhost:17db 07:33:49>>explain select * from innodb_test where id>3;  
    10. +----+-------------+-------------+-------+---------------+---------+---------+------+------+-------------+  
    11. | id | select_type | table       | type | possible_keys | key     | key_len | ref | rows | Extra       |  
    12. +----+-------------+-------------+-------+---------------+---------+---------+------+------+-------------+  
    13. | 1 | SIMPLE      | innodb_test | range | PRIMARY       | PRIMARY | 4       | NULL |    7 | Using where |  
    14. +----+-------------+-------------+-------+---------------+---------+---------+------+------+-------------+  
    15. 1 row in set (0.00 sec)  
    16.  

      2:不能用在order by情况下来提高速度

    1. mysql--root@localhost:17db 07:33:55>>explain select * from innodb_test order by id;  
    2. +----+-------------+-------------+-------+---------------+---------+---------+------+------+-------+  
    3. | id | select_type | table       | type | possible_keys | key     | key_len | ref | rows | Extra |  
    4. +----+-------------+-------------+-------+---------------+---------+---------+------+------+-------+  
    5. | 1 | SIMPLE      | innodb_test | index | NULL          | PRIMARY | 4       | NULL |   15 |       |  
    6. +----+-------------+-------------+-------+---------------+---------+---------+------+------+-------+  
    7. 1 row in set (0.00 sec)  
    8.  
    9. mysql--root@localhost:17db 07:34:27>>explain select * from mem_test order by id;  
    10. +----+-------------+----------+------+---------------+------+---------+------+------+----------------+  
    11. | id | select_type | table    | type | possible_keys | key | key_len | ref | rows | Extra          |  
    12. +----+-------------+----------+------+---------------+------+---------+------+------+----------------+  
    13. | 1 | SIMPLE      | mem_test | ALL | NULL          | NULL | NULL    | NULL |   15 | Using filesort |  
    14. +----+-------------+----------+------+---------------+------+---------+------+------+----------------+  
    15. 1 row in set (0.00 sec)  
    16.  

      3:不能确定俩值之间有多少行

    1. mysql--root@localhost:17db 07:37:14>>explain select count(1) from mem_test where id>3 and id<6;  
    2. +----+-------------+----------+------+---------------+------+---------+------+------+-------------+  
    3. | id | select_type | table    | type | possible_keys | key | key_len | ref | rows | Extra       |  
    4. +----+-------------+----------+------+---------------+------+---------+------+------+-------------+  
    5. | 1 | SIMPLE      | mem_test | ALL | PRIMARY       | NULL | NULL    | NULL |   20 | Using where |  
    6. +----+-------------+----------+------+---------------+------+---------+------+------+-------------+  
    7. 1 row in set (0.00 sec)  
    8.  
    9. mysql--root@localhost:17db 07:40:35>>explain select count(1) from innodb_test where id>3 and id<6;  
    10. +----+-------------+-------------+-------+---------------+---------+---------+------+------+--------------------------+  
    11. | id | select_type | table       | type | possible_keys | key     | key_len | ref | rows | Extra                    |  
    12. +----+-------------+-------------+-------+---------------+---------+---------+------+------+--------------------------+  
    13. | 1 | SIMPLE      | innodb_test | range | PRIMARY       | PRIMARY | 4       | NULL |    1 | Using where; Using index |  
    14. +----+-------------+-------------+-------+---------------+---------+---------+------+------+--------------------------+  
    15. 1 row in set (0.00 sec)  
    16.  

      4:在多列索引的情况下,只有全部指定才能利用hash扫描,而B-tree确可以利用索引的最左端来查找

    1. mysql--root@localhost:17db 07:37:07>>explain select * from innodb_test where name=b;  
    2. +----+-------------+-------------+------+---------------+-----------+---------+-------+------+--------------------------+  
    3. | id | select_type | table       | type | possible_keys | key       | key_len | ref   | rows | Extra                    |  
    4. +----+-------------+-------------+------+---------------+-----------+---------+-------+------+--------------------------+  
    5. | 1 | SIMPLE      | innodb_test | ref | NewIndex1     | NewIndex1 | 33      | const |    8 | Using where; Using index |  
    6. +----+-------------+-------------+------+---------------+-----------+---------+-------+------+--------------------------+  
    7. 1 row in set (0.00 sec)  
    8.  
    9. mysql--root@localhost:17db 07:37:10>>explain select * from mem_test where name=b;  
    10. +----+-------------+----------+------+---------------+------+---------+------+------+-------------+  
    11. | id | select_type | table    | type | possible_keys | key | key_len | ref | rows | Extra       |  
    12. +----+-------------+----------+------+---------------+------+---------+------+------+-------------+  
    13. | 1 | SIMPLE      | mem_test | ALL | NewIndex1     | NULL | NULL    | NULL |   20 | Using where |  
    14. +----+-------------+----------+------+---------------+------+---------+------+------+-------------+  
    15.  

      当然内存表也可以手动添加btree

    1. CREATE INDEX BTREE_index USING BTREE on mem_test(name,first)  
    2. mysql--root@localhost:17db 03:36:41>>explain select * from mem_test where name=b;  
    3. +----+-------------+----------+------+-----------------------+-------------+---------+-------+------+-------------+  
    4. | id | select_type | table    | type | possible_keys         | key         | key_len | ref   | rows | Extra       |  
    5. +----+-------------+----------+------+-----------------------+-------------+---------+-------+------+-------------+  
    6. | 1 | SIMPLE      | mem_test | ref | NewIndex1,BTREE_index | BTREE_index | 33      | const |    9 | Using where |  
    7. +----+-------------+----------+------+-----------------------+-------------+---------+-------+------+-------------+  
    8. 1 row in set (0.00 sec)  

      哈哈,它也用到索引了  。
    所以要选择合适的存储引擎至关重要  。

  • 相关阅读:
    总有一天你将破蛹而出
    java 连接 Access数据库的两种方法
    freemarker中页面直接可以使用的内置对象
    freemarker中页面直接可以使用的内置对象
    常见的样式
    ibatis常用的集中判断语句
    mysql类型转换
    ibatis常用的集中判断语句
    window.open打开窗口时父窗口变成object
    window.open打开窗口时父窗口变成object
  • 原文地址:https://www.cnblogs.com/balaamwe/p/2475641.html
Copyright © 2011-2022 走看看