fedora8连接本机mysql速度慢,高手帮帮忙

w0911h 2009-05-06 06:02:02
mysql版本为fedora8安装时自带的5.0.45-4.fc8,自己下载了对应的开发包,连接数据库后执行SQL语句速度特别慢,下面是我试验时查询的表,总共3个字段,记录数10条以下

mysql> describe DZJC_T_CSDM_B;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| DMLB | decimal(2,0) | NO | PRI | | |
| DMZ | varchar(10) | NO | PRI | | |
| DMMS | varchar(50) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+

下面是数据库查询和计时的部分代码,sql查询的时间一般在200-300毫秒,请高手帮忙看看可能是什么原因导致的速度慢。

myconnect = mysql_init(myconnect);
if (mysql_real_connect (myconnect, "localhost", (char*)(DB_USER), (char*)(DB_PWD),(char*)(DB_NAME), MYSQL_PORT,NULL,0)== NULL)
{
perror("未能连接上数据库");
}
struct timeval start, end;
long timeuse;

gchar query_buf[255];
sprintf(query_buf, "select * from DZJC_T_CSDM_B where DMLB = '1'");

gettimeofday(&start, NULL);
if(mysql_query(myconnect, query_buf)==0)
{
gettimeofday(&end, NULL);
timeuse = 1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec - start.tv_usec;
printf("sql query time = %ld\n", timeuse);
...全文
90 点赞 收藏 10
写回复
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2009-05-07

你可以到linux下,以有权限的账号登录。比如linux#root账号。
然后执行 mysql -u DB_USER -p DB_NAME
然后执行 select * from DZJC_T_CSDM_B where DMLB = 1 的执行速度

在命令行下并不是没出精确的时间,只不过是想确定问题是在mysql上还是在你的C程序中。很显然,如果在mysql命令行下速度很快,则你需要把精力放在你的C程序中找原因。如果在mysql中就很慢,则再继续看是mysql什么原因,去调整优化一些参数。

回复
w0911h 2009-05-07
[Quote=引用 7 楼 ACMAIN_CHM 的回复:]
如果这样,建议你直接在mysql命令工具下测试一下查询语句的速度。先确定速度慢的影响元素是在MySQL侧还是在C程序侧。
[/Quote]
第一次用linux和mysql,在命令行下可以测出比较精确的时间吗,如果可以的话要怎么做?谢谢!
回复
ACMAIN_CHM 2009-05-07

如果这样,建议你直接在mysql命令工具下测试一下查询语句的速度。先确定速度慢的影响元素是在MySQL侧还是在C程序侧。
回复
w0911h 2009-05-07
[Quote=引用 4 楼 ACMAIN_CHM 的回复:]
加不加索引在查询是差别很大。不加索引需要全表扫描,比如从一万条记录找一条,没有索引则需要一条条从头到最后,最不利的情况就是,最后一条才是你想要的记录。如果一条记录的本身长度也很大,则会花很多时间。

但如果有索引,则只需要log2(10000)次则可以找到这条记录。
[/Quote]
谢谢你的解释,这么说的话如果表中的数据量很小,而且一条记录本身也很小,那么不加索引应该也不会有大的影响吧,而且我测试了插入操作,速度也同样很慢,这是不是说明不是索引的问题呢?
回复
yuanwen1314 2009-05-07
UP
回复
ACMAIN_CHM 2009-05-07

加不加索引在查询是差别很大。不加索引需要全表扫描,比如从一万条记录找一条,没有索引则需要一条条从头到最后,最不利的情况就是,最后一条才是你想要的记录。如果一条记录的本身长度也很大,则会花很多时间。

但如果有索引,则只需要log2(10000)次则可以找到这条记录。
回复
w0911h 2009-05-07
[Quote=引用 2 楼 ACMAIN_CHM 的回复:]
改成
C/C++ codesprintf(query_buf,"select * from DZJC_T_CSDM_B where DMLB = 1");

你的DMLB 本来就是数字型,不要用字符型的'1'去比较,反而无法用上你的索引。


[/Quote]
改了之后速度还是慢,这个表最简单所以用这个做例子,对其它表的操作一样都很慢,另外,对这么个简单的表操作加索引和不加索引差别会很大吗,不加索引会需要这么久吗?
回复
w0911h 2009-05-07
[Quote=引用 9 楼 ACMAIN_CHM 的回复:]
你可以到linux下,以有权限的账号登录。比如linux#root账号。
然后执行 mysql -u DB_USER -p DB_NAME
然后执行 select * from DZJC_T_CSDM_B where DMLB = 1 的执行速度

在命令行下并不是没出精确的时间,只不过是想确定问题是在mysql上还是在你的C程序中。很显然,如果在mysql命令行下速度很快,则你需要把精力放在你的C程序中找原因。如果在mysql中就很慢,则再继续看是mysql什么原因,去调整优化一些参数。
[/Quote]

谢谢,问题解决了,给分!
回复
ACMAIN_CHM 2009-05-06

改成
sprintf(query_buf, "select * from DZJC_T_CSDM_B where DMLB = 1");    


你的DMLB 本来就是数字型,不要用字符型的'1'去比较,反而无法用上你的索引。

回复
ACMAIN_CHM 2009-05-06

改成
sprintf(query_buf, "select * from DZJC_T_CSDM_B where DMLB = 1");    


你的DMLB 本来就是数字型,不要用字符型的'1'去比较,反而无法用上你的索引。

回复
发动态
发帖子
MySQL
创建于2007-09-28

5.4w+

社区成员

MySQL相关内容讨论专区
申请成为版主
社区公告
暂无公告