Mysql 执行时间

cfd406635982 2010-09-15 10:55:39
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都有索引。为什么???
...全文
102 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
cfd406635982 2010-09-15
  • 打赏
  • 举报
回复
还有上面的两次测试都是在把重复的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
cfd406635982 2010-09-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zuoxingyu 的回复:]
SELECT SQL_NO_CACHE count(id) from t_test;
SELECT SQL_NO_CACHE count(name) from t_test;

看看。
[/Quote]



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)

cfd406635982 2010-09-15
  • 打赏
  • 举报
回复
我重启了电脑试了一下 :如下 ,这次是首先按照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)
zuoxingyu 2010-09-15
  • 打赏
  • 举报
回复
前面看过老叶写的一篇文章,演示了第二索引的COUNT速度比主键索引的要快,
zuoxingyu 2010-09-15
  • 打赏
  • 举报
回复
SELECT SQL_NO_CACHE count(id) from t_test;
SELECT SQL_NO_CACHE count(name) from t_test;

看看。
software51 2010-09-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wwwwb 的回复:]
后一条SQL可以直接从CACHE中读取,运行完第1条SQL语句后,重新启动机器再运行第2条SQL语句,时间应该相差不多
[/Quote]

顶!很不错的注意!
limohao 2010-09-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 cfd406635982 的回复:]
mysql数据库。。

SQL code

PRIMARY KEY (`id`),
KEY `id` (`id`),

[/Quote]

首先你的重复的KEY,删除其中一个
要注意innodb的缓存,你第二次查应当是用到了缓存。
另外你的机器是不是比较差,或者是没有优化
我查找
124800000的数据第一次只用了70秒,第二次只用了23秒
我的机器8C,16G内存
wwwwb 2010-09-15
  • 打赏
  • 举报
回复
但是如果用name来查就很快。

重新启动机器再用name来查,看看时间
cfd406635982 2010-09-15
  • 打赏
  • 举报
回复
按照Id来查的话 不用缓存?
我联系用Id来查的话 也是很慢的
但是如果用name来查就很快。
wwwwb 2010-09-15
  • 打赏
  • 举报
回复
后一条SQL可以直接从CACHE中读取,运行完第1条SQL语句后,重新启动机器再运行第2条SQL语句,时间应该相差不多
feixianxxx 2010-09-15
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 cfd406635982 的回复:]

哦 谢谢了
[/Quote]
mysiam 引擎会帮助存储记下 表中的记录数 而不是进行扫描统计~
cfd406635982 2010-09-15
  • 打赏
  • 举报
回复
哦 谢谢了
ACMAIN_CHM 2010-09-15
  • 打赏
  • 举报
回复
[Quote]查询太大了 把引擎改成myisam以后的时间:


为什么呢?[/Quote]

很正常啊。 你不理解的是什么? SELECT直接用NAME的索引中统计。 另外ID是主键,MYSQL直接从统计结果中取数据。
cfd406635982 2010-09-15
  • 打赏
  • 举报
回复
查询太大了 把引擎改成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)

为什么呢?
feixianxxx 2010-09-15
  • 打赏
  • 举报
回复
PRIMARY KEY (`id`),
KEY `id` (`id`),
KEY `name_index` (`name`)

红色部分的定义去掉 多余了
ACMAIN_CHM 2010-09-15
  • 打赏
  • 举报
回复
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;是不同的查询语句,不会利用缓冲结果。
rucypli 2010-09-15
  • 打赏
  • 举报
回复
set profiling = 1
show profile cpu,block io for query 1;

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧