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);

解决方案 »

  1.   

    改成
    sprintf(query_buf, "select * from DZJC_T_CSDM_B where DMLB = 1");    你的DMLB  本来就是数字型,不要用字符型的'1'去比较,反而无法用上你的索引。
      

  2.   

    改成
    sprintf(query_buf, "select * from DZJC_T_CSDM_B where DMLB = 1");    你的DMLB  本来就是数字型,不要用字符型的'1'去比较,反而无法用上你的索引。
      

  3.   

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

  4.   

    如果这样,建议你直接在mysql命令工具下测试一下查询语句的速度。先确定速度慢的影响元素是在MySQL侧还是在C程序侧。
      

  5.   

    第一次用linux和mysql,在命令行下可以测出比较精确的时间吗,如果可以的话要怎么做?谢谢!
      

  6.   

    你可以到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什么原因,去调整优化一些参数。