织梦CMS - 轻松建站从此开始!

罗索

SQLite 查询优化的例子

jackyhwei 发布于 2010-12-24 21:11 点击:次 
上次讲到了SQLite的查询优化代码中的具体实现,现在来看一下它的几个实例
TAG:

原文:http://club.tech.163.com/bbs/mobile_develop/185082109.html

上次讲到了SQLite的查询优化代码中的具体实现,现在来看一下它的几个实例:

  1. #include "stdio.h"  
  2.  
  3. #include "sqlite3.h"  
  4. #include <windows.h>  
  5.  
  6. void query(sqlite3 *db,sqlite3_stmt *stmt,char * sql);  
  7.  
  8. int main(int argc, char **argv)  
  9. {  
  10. sqlite3 *db;  
  11. char *zErr;  
  12. int rc;  
  13. char *sql;  
  14. sqlite3_stmt *stmt=0;  
  15. rc = sqlite3_open("memory.db", &db);  
  16. if(rc) {  
  17. fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));  
  18. sqlite3_close(db);  
  19. }  
  20. //下面是所建的各个表的结构  
  21. sql="CREATE TABLE t1 (num int,word TEXT NOT NULL)";  
  22. //sql="CREATE TABLE t4 (num INTEGER NOT NULL,word TEXT NOT NULL)";  
  23. //sql="CREATE TABLE t3 (num INTEGER NOT NULL,word TEXT NOT NULL)";  
  24. rc = sqlite3_exec(db, sql, NULL, NULL, &zErr);  
  25. if(rc != SQLITE_OK) {  
  26. if (zErr != NULL) {  
  27. fprintf(stderr, "SQL error: %s\n", zErr);  
  28. sqlite3_free(zErr);  
  29. }  
  30. }  
  31.  
  32. //下面是对所以插入进行手动提交,这样可以加快 插入速度  
  33. //sqlite3_exec(db,"BEGIN",NULL,NULL,&zErr);  
  34. //插入1000000条记录  
  35. //for (int i=0;i<1000000;i++)  
  36. //{  
  37. // sql = sqlite3_mprintf("insert into t1 values(%d,'%s')",i,"goodc");  
  38. // rc = sqlite3_exec(db, sql, NULL, NULL, &zErr);  
  39. //}  
  40. //sqlite3_exec(db,"COMMIT",NULL,NULL,&zErr);  
  41.  
  42. sql="create index t1nwindex on t1(num)";  
  43. rc=sqlite3_exec(db, sql, NULL, NULL, &zErr);  
  44. if(rc != SQLITE_OK) {  
  45. if (zErr != NULL) {  
  46. fprintf(stderr, "SQL error: %s\n", zErr);  
  47. sqlite3_free(zErr);  
  48. }  
  49. }  
  50.  
  51. //sql="drop index t1nwindex";  
  52. //sql="drop index t3index";  
  53. //sql="delete from t2";  
  54. rc=sqlite3_exec(db, sql, NULL, NULL, &zErr);  
  55. if(rc != SQLITE_OK) {  
  56. if (zErr != NULL) {  
  57. fprintf(stderr, "SQL error: %s\n", zErr);  
  58. sqlite3_free(zErr);  
  59. }  
  60. }  
  61.  
  62. printf("查询结果是:\n");  
  63. //sql="select * from t1 where num=3000 or num=2000";//有INTEGER PRIMARY KEY,快  
  64. //sql="select * from t2 where num=3000 or num=2000";//没有索引,慢  
  65. //sql="select * from t3 where num=3000 or num=2000";//有索引,快  
  66.  
  67. //这里交换位置了,但是结果用的时间 想差比较大的原因是,t1是用索引存储的,但是它不是由create index  
  68. //而创建的,所以系统还不会把它作为 索引处理,所以这两个表就只是无索引的表,在内部优化计算代价只是对它  
  69. //进行估计,因为源代码中没有捕获到 下面的查询条件,所以都是系统最大值(源代码中有),所以就嵌套顺序没  
  70. //变,所以出现下面的差异。  
  71. //sql="SELECT count(*) FROM t3, t1 WHERE t1.num = t3.num";//比下面的快,由于内层少  
  72. //sql="SELECT count(*) FROM t1, t3 WHERE t1.num = t3.num";//比上面的慢,由于内层多  
  73.  
  74. //下面这个已经内部实现优化,所以所 用时间是相同的  
  75. //sql="SELECT * FROM t2, t3 WHERE t2.num = t3.num";//有索引,稍快  
  76. //sql="SELECT * FROM t3, t2 WHERE t2.num = t3.num";//同上,内部已经优化  
  77.  
  78. //sql="select * from t3 where num=8000";//有索引,快  
  79. //sql="select * from t1 where num%2=0";//有索引,但不能用,很慢  
  80. //sql="select * from t1 where num=8000";//没有索引,慢  
  81.  
  82. //BETWEEN的转换优化---内 部已经实现优化,如果有索引的话快一点  
  83. //sql="select count(*) from t2 where word between 'goodl' and 'goodm'";//BETWEEN  
  84.  
  85. //sql="select count(*) from t2 where word > ='goodl' and word<'goodm'";//BETWEEN的转换  
  86.  
  87. //LIKE的转换优化---内部已经 实现优化  
  88. //sql="select count(*) from t2 where word like 'goodl%'";//有索引不起作用  
  89. //sql="select count(*) from t2 where word > ='goodl' and word <'goodm'";//如果有索引会更快  
  90.  
  91. //IN的转换优化---内部没有实现 优化,但此时如果可以用索引的话就会很好  
  92. //如果不用索引则在这里体现不出IN 比OR优,而如果有索引则差别很明显  
  93. //sql="select count(*) from t2 where word in('goodllll','goodkkkk','goodaaaa')";  
  94. //sql="select count(*) from t2 where word ='goodllll'
  95. // or word ='goodkkkk' or word='goodaaaa'";  
  96.  
  97. int start=GetTickCount();  
  98. query(db,stmt,sql);  
  99. printf("the time has pass:%dms\n",GetTickCount()-start);  
  100. sqlite3_close(db);  
  101. return 0;  
  102. }  
  103.  
  104. void query(sqlite3 *db,sqlite3_stmt *stmt,char * sql){  
  105. int rc,ncols,i;  
  106. const char *tail;  
  107. rc = sqlite3_prepare(db, sql, -1, &stmt, &tail);  
  108. if(rc != SQLITE_OK) {  
  109. fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));  
  110. }  
  111. rc = sqlite3_step(stmt);  
  112. ncols = sqlite3_column_count(stmt);  
  113. while(rc == SQLITE_ROW) {  
  114. for(i=0; i < ncols; i++) {  
  115. fprintf(stderr, "'%s' ", sqlite3_column_text(stmt, i));  
  116. }  
  117. fprintf(stderr, "\n");  
  118. rc = sqlite3_step(stmt);  
  119. }  
  120. }  

 

(秩名)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201012/10663.html]
本文出处:网易 作者:秩名
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容