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都有索引。为什么???
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都有索引。为什么???
我联系用Id来查的话 也是很慢的
但是如果用name来查就很快。
首先你的重复的KEY,删除其中一个
要注意innodb的缓存,你第二次查应当是用到了缓存。
另外你的机器是不是比较差,或者是没有优化
我查找
124800000的数据第一次只用了70秒,第二次只用了23秒
我的机器8C,16G内存
SELECT SQL_NO_CACHE 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)
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)
表的语句: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
show profile cpu,block io for query 1;
2. 你的是INNODB, 原理可能是ID是主键,而NAME是非主键。 INNODB的主键是聚集索引,而NAME是非主键则是单独的。因此访问速度会快一些。 关于这个猜想,你可以换成MYISAM来测试一下。
3. select count(id) from t_test; 和select count(name) from t_test;是不同的查询语句,不会利用缓冲结果。
KEY `id` (`id`),
KEY `name_index` (`name`)红色部分的定义去掉 多余了
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)为什么呢?
很正常啊。 你不理解的是什么? SELECT直接用NAME的索引中统计。 另外ID是主键,MYSQL直接从统计结果中取数据。