mysql数据库。。//创建语句如下:
CREATE TABLE `t_test2` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(30) DEFAULT NULL,
 `addr` varchar(30) DEFAULT NULL,
 `email` varchar(30) DEFAULT NULL,
 `note` varchar(3000) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `id` (`id`),
 KEY `name_index` (`name`)
 )ENGINE=InnoDB AUTO_INCREMENT=1094469 DEFAULT CHARSET=utf8 执行下面的操作:时间如下:mysql> select count(id) from t_test;
+-----------+
| count(id) |
+-----------+
|   1013432 |
+-----------+
1 row in set (53.38 sec)mysql> select count(name) from t_test;
+-------------+
| count(name) |
+-------------+
|     1013432 |
+-------------+
1 row in set (11.67 sec)
我想问一下。为什么按照ID来查的话,会慢这么多
Id和name都有索引。为什么???

解决方案 »

  1.   

    后一条SQL可以直接从CACHE中读取,运行完第1条SQL语句后,重新启动机器再运行第2条SQL语句,时间应该相差不多
      

  2.   

    按照Id来查的话 不用缓存?
    我联系用Id来查的话 也是很慢的
    但是如果用name来查就很快。
      

  3.   

    但是如果用name来查就很快。重新启动机器再用name来查,看看时间
      

  4.   


    首先你的重复的KEY,删除其中一个
    要注意innodb的缓存,你第二次查应当是用到了缓存。
    另外你的机器是不是比较差,或者是没有优化
    我查找
    124800000的数据第一次只用了70秒,第二次只用了23秒
    我的机器8C,16G内存
      

  5.   

    SELECT SQL_NO_CACHE count(id) from t_test;
    SELECT SQL_NO_CACHE count(name) from t_test;看看。
      

  6.   

    前面看过老叶写的一篇文章,演示了第二索引的COUNT速度比主键索引的要快,
      

  7.   

    我重启了电脑试了一下 :如下 ,这次是首先按照name来的.mysql> select count(name) from t_test;
    +-------------+
    | count(name) |
    +-------------+
    |     1013432 |
    +-------------+
    1 row in set (35.84 sec)mysql> select count(id) from t_test;
    +-----------+
    | count(id) |
    +-----------+
    |   1013432 |
    +-----------+
    1 row in set (56.22 sec)mysql> select count(name) from t_test;
    +-------------+
    | count(name) |
    +-------------+
    |     1013432 |
    +-------------+
    1 row in set (13.67 sec)mysql> select count(id) from t_test;
    +-----------+
    | count(id) |
    +-----------+
    |   1013432 |
    +-----------+
    1 row in set (56.70 sec)
      

  8.   


    mysql> SELECT SQL_NO_CACHE count(id) from t_test;
    +-----------+
    | count(id) |
    +-----------+
    |   1013432 |
    +-----------+
    1 row in set (46.73 sec)mysql> SELECT SQL_NO_CACHE count(name) from t_test;
    +-------------+
    | count(name) |
    +-------------+
    |     1013432 |
    +-------------+
    1 row in set (11.56 sec)
      

  9.   

    还有上面的两次测试都是在把重复的id索引删除了以后做的。
    表的语句:CREATE TABLE `t_test` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(30) DEFAULT NULL,
      `addr` varchar(30) DEFAULT NULL,
      `email` varchar(30) DEFAULT NULL,
      `note` varchar(3000) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `name_index` (`name`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1094469 DEFAULT CHARSET=utf8
      

  10.   

    set profiling  = 1
    show profile cpu,block io for query 1;
      

  11.   

    1. 不需要重启MYSQL来测试,显然过于浪费。 其实只需要用 6 楼 zuoxingyu 的 SQL_NO_CACHE 就行。
    2. 你的是INNODB, 原理可能是ID是主键,而NAME是非主键。 INNODB的主键是聚集索引,而NAME是非主键则是单独的。因此访问速度会快一些。 关于这个猜想,你可以换成MYISAM来测试一下。
    3. select count(id) from t_test; 和select count(name) from t_test;是不同的查询语句,不会利用缓冲结果。
      

  12.   

    PRIMARY KEY (`id`),
     KEY `id` (`id`),
     KEY `name_index` (`name`)红色部分的定义去掉 多余了 
      

  13.   

    查询太大了 把引擎改成myisam以后的时间:
    mysql> SELECT SQL_NO_CACHE count(name) from t_test;
    +-------------+
    | count(name) |
    +-------------+
    |     1013432 |
    +-------------+
    1 row in set (1.84 sec)mysql> SELECT SQL_NO_CACHE count(id) from t_test;
    +-----------+
    | count(id) |
    +-----------+
    |   1013432 |
    +-----------+
    1 row in set (0.00 sec)为什么呢?
      

  14.   


    很正常啊。 你不理解的是什么? SELECT直接用NAME的索引中统计。 另外ID是主键,MYSQL直接从统计结果中取数据。
      

  15.   

    mysiam 引擎会帮助存储记下 表中的记录数 而不是进行扫描统计~