首页 > 挨踢(IT), 数据库 > WordPress和数据库XXOO的那些SQL

WordPress和数据库XXOO的那些SQL

2012年12月26日 发表评论 阅读评论 1,294 人阅读    

  Wordpress 是一个功能非常强大、目前世界上使用最广泛的博客系统。D瓜哥的“‘地瓜哥’博客网”就是使用Wordpress搭建起来的。同时,由于D瓜哥也是搞挨踢(体面的称呼是“IT”)的,所以对Wordpress的实现很感兴趣。尤其是,安装好WP之后,只有十个表左右,更是让D瓜哥对其数据模型着迷不已啊!但是,看了Wordpress官网提供“数据库描述”,只是冰冷冷的表结构描述,很不解渴!抽空看看Wordpress和数据库时如何XXOO的?

  前天晚上,很多人都在过二人世界的时候,在这么美丽的圣诞节夜晚,D瓜哥也不落伍,在旁观WordPress和数据的XXOO!而且旁观的还很“深入细致”,直接把细节都记录下来!下面让我们来看看它们的XX日记。

  D瓜哥想,即使哥不动手,Wordpress和数据库的XXOO也可以记录的很深入细致:数据库(这里特指MySQL)应该可以有地方记录Wordpress和她XXOO的那些事。然后,D瓜哥就是用Google百度了一下,果然可以:我们可以通过MySQL的日志,来记录执行过的SQL语句。具体操作如下:

  打开MySQL的配置文件my.ini,在里面找到下面高亮的一行,然后增加一行日志记录。修改后的代码如下:

1# 这行配置是配置错误日志的输出文件
2log_error = "mysql_error.log"
3 
4# 下面是新增的日志文件
5log = "mysql.log"

  根据D瓜哥的个人经验,有两点需要说明一下:

  1. 有些参考资料显示,日志路径可以随意配置。但是D瓜哥配置到了C盘,没有成功。所以,建议大家配置到和错误日志一样的路径即可。今天D瓜哥又想到,可能MySQL没有在C盘下的创建文件的权限吧。
  2. 如上配置的话,日志文件应该在%MySQL_HOME%\data\目录下。建议大家在这里根据配置文件中日志文件的名称,创建一个空文件。否则,MySQL会自动创建,这样可能会出现无法复制的情况。(当复制这个日志文件时,需要管理员权限;而且,在D瓜哥试验的时候,关闭数据库,这个日志文件就好自动被删除。)

  经过上面的折腾,重启一下Mysql,刷新一下Wordpress的页面,Wordpress和数据库XXOO的详情就记录在案了。然后,把日志取出来,去伪存真,就是XXOO的那些SQL了。

  然后,我们来分析一下,当我们打开一篇文章时,都会执行哪些SQL?

001-- 启动时,加载一些必要的参数
002SELECT option_name, option_value
003   FROM wp_options
004   WHERE autoload = 'yes';
005 
006-- ?这个是干嘛的?
007SELECT option_value
008   FROM wp_options
009   WHERE option_name = 'widget_pages'
010   LIMIT 1;
011 
012-- ?这个又是干嘛的?
013SELECT option_value
014   FROM wp_options
015   WHERE option_name = 'widget_calendar'
016   LIMIT 1;
017 
018-- ?这个是干嘛啊?
019SELECT option_value
020   FROM wp_options
021   WHERE option_name = 'widget_nav_menu'
022   LIMIT 1;
023 
024-- 打开某一篇文章时,查询文件的内容。
025SELECT   wp_posts.*
026   FROM wp_posts 
027   WHERE 1=1 
028      AND wp_posts.ID = 37
029      AND wp_posts.post_type = 'post' 
030   ORDER BY wp_posts.post_date DESC;
031 
032-- 查询文章对应的Tag、Category以及Post Format
033SELECT t.*, tt.*, tr.object_id
034   FROM wp_terms AS t
035   INNER JOIN wp_term_taxonomy AS tt
036      ON tt.term_id = t.term_id
037   INNER JOIN wp_term_relationships AS tr
038      ON tr.term_taxonomy_id = tt.term_taxonomy_id
039   WHERE tt.taxonomy IN ('category', 'post_tag', 'post_format')
040      AND tr.object_id IN (37)
041   ORDER BY t.name ASC;
042 
043-- 查询一个文章对应的Meta,会根据按照的插件的不同,结果有所不同。
044-- 从这里也可以看出一些插件的存储。
045SELECT post_id, meta_key, meta_value
046   FROM wp_postmeta
047   WHERE post_id IN (37);
048 
049-- 查询上一篇文章的内容,用于显示时下一篇的链接和Title。
050SELECT p.* FROM wp_posts AS
051   WHERE p.post_date < '2012-07-25 08:58:42'
052      AND p.post_type = 'post'
053      AND p.post_status = 'publish' 
054ORDER BY p.post_date DESC
055LIMIT 1;
056 
057-- 查询上一篇文章的内容,用于显示时上一篇的链接和Title。
058SELECT p.*
059   FROM wp_posts AS
060   WHERE p.post_date > '2012-07-25 08:58:42'
061      AND p.post_type = 'post'
062      AND p.post_status = 'publish' 
063   ORDER BY p.post_date ASC
064   LIMIT 1;
065 
066-- ?没搞清楚这个是干嘛的?!
067SELECT meta_id
068   FROM wp_postmeta
069   WHERE meta_key = 'views'
070   AND post_id = 37;
071 
072-- 更新阅读次数。安装了wp-postviews才有。
073UPDATE `wp_postmeta` SET `meta_value` = '5'
074   WHERE `post_id` = 37
075      AND `meta_key` = 'views';
076 
077-- 查询需要显示的Page
078SELECT *
079   FROM wp_posts 
080   WHERE (post_type = 'page'
081      AND post_status = 'publish')
082   ORDER BY menu_order ASC;
083 
084-- 查询文章的作者信息。用于显示作者名和链接。
085SELECT * FROM wp_users WHERE ID = '2';
086 
087-- 查询文章的作者信息的Meta。
088SELECT user_id, meta_key, meta_value
089   FROM wp_usermeta
090   WHERE user_id IN (2);
091 
092-- 查询文章的Meta。因为按照的插件不同,结果可能会有不同。
093SELECT post_id, meta_key, meta_value
094   FROM wp_postmeta
095   WHERE post_id IN (37);
096 
097-- 查询文章对应的评论
098SELECT * FROM wp_comments 
099   WHERE comment_approved = '1'
100      AND comment_post_ID = 37
101   ORDER BY comment_date_gmt ASC;
102 
103-- ?没搞清除这个干嘛的?
104SELECT * FROM wp_users WHERE ID = '1';
105 
106-- ?没搞清除这个干嘛的?
107SELECT user_id, meta_key, meta_value
108   FROM wp_usermeta
109   WHERE user_id IN (1);
110 
111-- 查出最受欢迎的十篇文章。安装了wp-postviews,开启相应的Widget才有。
112SELECT DISTINCT (meta_value+0) AS views ,
113      wp_posts.*, (meta_value+0) AS views
114   FROM wp_posts
115   LEFT JOIN wp_postmeta
116      ON wp_postmeta.post_id = wp_posts.ID
117   WHERE post_date < '2012-12-24 23:42:10'
118      AND post_type = 'post'
119      AND post_status = 'publish'
120      AND meta_key = 'views'
121      AND post_password = ''
122   ORDER BY views DESC
123   LIMIT 10;
124 
125-- 查询文章的阅读次数
126SELECT meta_value
127   FROM wp_postmeta t
128   WHERE t.meta_key = 'views'
129   AND t.post_id = 37;
130 
131-- ?没搞清除这个干嘛的?
132SELECT wp_posts.ID
133   FROM wp_posts 
134   WHERE 1=1 
135      AND wp_posts.post_type = 'post'
136      AND (wp_posts.post_status = 'publish'
137   ORDER BY wp_posts.post_date DESC
138   LIMIT 0, 10;
139 
140-- ?没搞清除这个干嘛的?
141SELECT wp_posts.* FROM wp_posts WHERE ID IN (48);
142 
143-- 查询文章对应的Tag、Category以及Post Format
144SELECT t.*, tt.*, tr.object_id
145   FROM wp_terms AS t
146   INNER JOIN wp_term_taxonomy AS tt
147      ON tt.term_id = t.term_id
148   INNER JOIN wp_term_relationships AS tr
149      ON tr.term_taxonomy_id = tt.term_taxonomy_id
150   WHERE tt.taxonomy IN ('category', 'post_tag', 'post_format')
151      AND tr.object_id IN (48)
152   ORDER BY t.name ASC;
153 
154-- 查询文章对应的Meta
155SELECT post_id, meta_key, meta_value
156   FROM wp_postmeta
157   WHERE post_id IN (48);
158 
159-- ?这个是干嘛的?
160SELECT t.*, tt.*, tr.object_id
161   FROM wp_terms AS t
162   INNER JOIN wp_term_taxonomy AS tt
163      ON tt.term_id = t.term_id
164   INNER JOIN wp_term_relationships AS tr
165      ON tr.term_taxonomy_id = tt.term_taxonomy_id
166   WHERE tt.taxonomy IN ('category', 'post_tag', 'post_format')
167             -- 下面这些ID从何而来?
168      AND tr.object_id IN (58, 55, 49, 47, 46, 45, 39, 34) 
169   ORDER BY t.name ASC;
170 
171-- ?没搞清干啥用?
172SELECT post_id, meta_key, meta_value
173   FROM wp_postmeta
174   WHERE post_id IN (58,55,49,47,46,45,39,34);
175 
176-- 查询标签云
177SELECT t.*, tt.*
178   FROM wp_terms AS t
179   INNER JOIN wp_term_taxonomy AS tt
180      ON t.term_id = tt.term_id
181   WHERE tt.taxonomy IN ('post_tag')
182      AND tt.count > 0
183   ORDER BY tt.count DESC
184   LIMIT 45;
185 
186-- 查询每个月的文章总数
187SELECT YEAR(post_date) AS `year`,
188      MONTH(post_date) AS `month`,
189      count(ID) as posts
190   FROM wp_posts 
191   WHERE post_type = 'post'
192      AND post_status = 'publish'
193   GROUP BY YEAR(post_date), MONTH(post_date)
194   ORDER BY post_date DESC;
195 
196-- 查询文章分类
197SELECT t.*, tt.*
198   FROM wp_terms AS t
199   INNER JOIN wp_term_taxonomy AS tt
200      ON t.term_id = tt.term_id
201   WHERE tt.taxonomy IN ('category')
202      AND tt.count > 0
203   ORDER BY t.name ASC;
204 
205-- ?这是干嘛啊?
206SELECT YEAR(min(post_date_gmt)) AS firstyear,
207      YEAR(max(post_date_gmt)) AS lastyear
208   FROM wp_posts
209   WHERE post_date_gmt > 1970;

  从SQL的记录和我的简单解析来看,还有很多地方搞的不是很清楚,以后有机会D瓜哥会借助自己制造的Wordpress源码分析工具,再分析其源代码的实现的。敬请期待!

参考资料:

  1. 百度百科对Wordpress的介绍
  2. WordPress数据库描述
  3. mysql 的日志的启动与查看
  4. 通过日志查看mysql正在执行的SQL语句


作 者: D瓜哥,https://www.diguage.com/
原文链接:https://wordpress.diguage.com/archives/83.html
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。

  1. Roceys
    2012年12月27日13:59 | #1

    我喜欢。

  2. 2012年12月27日14:07 | #2

    很不错的分析文章。赞一个!!!

  3. 2013年1月5日10:05 | #3

    想写一个评论人信息的页面,接触了一下数据库。
    里面的评论信息是一个大的表。我还以为会将用户与评论内容分开。
    不知道这事为什么

    • D瓜哥
      2013年1月5日22:22 | #4

      没搞明白啥意思。其实Wordpress数据库结构整体还是比较简单的(链接、标签那块搞的还不是很清楚)。有机会交流交流。

  1. 本文目前尚无任何 trackbacks 和 pingbacks.