关于STMT的原理我个人理解是,MYSQL有个语句池,你预处理进来的语句他都给你保存下来,然后你下次在客户端执行SQL语句,实际没有传递SQL语句到mysql那边,而是语句ID(prepare的时候生成的?)和对应的参数,然后mysql根据本地的语句池里对应ID的语句来进行参数替换,然后执行.
不懂我这样理解会不会有错误,关键是我不懂那个ID是在什么时候怎么返回给客户端的,希望大家解答,谢谢了.

解决方案 »

  1.   

    那每次执行语句之前的还是要prepare啊,因为我这次执行并不知道mysql的语句池那边有没缓存我的语句啊,这样不是变成每个执行语句都要预处理了?这样不是适得其反了么
      

  2.   

    你每次都prepare,重要的行为在于服务器端,你传递过去了,人家未必要作解析。
    另外,你也不必每次都prepare. 如果是相同的sql语句,只需要调用prepare一次。
      

  3.   

    那就是 我本地应该用个东西来保存这些语句 这样才能知道说哪些是相同的sql
      

  4.   

    晕啊,server端难道不会缓存这些sql语句吗?本地只是发送这些sql语句而已。
      

  5.   

    因为 这样 
    当你mysql_stmt_prepare了"UPDATE test_table SET str = ? WHERE num = ?"这样的查询语句后,然后绑定一个结构体了,就可以用不同的参数去替换这2个?,然后mysql_stmt_execute就可以完成了,那如果我把预计内的语句都mysql_stmt_prepare了,后面用的时候只要对相应的语句对应的结构体传参数就可以mysql_stmt_execute出结果了我是这个意思
      

  6.   

    还是说每次使用的时候都还是要去调用mysql_stmt_prepare,mysql会自己判断说这个语句有没缓存在mysql的语句池,然后往语句池里对应的语句传参数 这样