首页
>
挨踢(IT),
数据库 > WordPress和数据库XXOO的那些SQL
WordPress和数据库XXOO的那些SQL
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,在里面找到下面高亮的一行,然后增加一行日志记录。修改后的代码如下:
2 | log_error = "mysql_error.log" |
根据D瓜哥的个人经验,有两点需要说明一下:
- 有些参考资料显示,日志路径可以随意配置。但是D瓜哥配置到了C盘,没有成功。所以,建议大家配置到和错误日志一样的路径即可。今天D瓜哥又想到,可能MySQL没有在C盘下的创建文件的权限吧。
- 如上配置的话,日志文件应该在%MySQL_HOME%\data\目录下。建议大家在这里根据配置文件中日志文件的名称,创建一个空文件。否则,MySQL会自动创建,这样可能会出现无法复制的情况。(当复制这个日志文件时,需要管理员权限;而且,在D瓜哥试验的时候,关闭数据库,这个日志文件就好自动被删除。)
经过上面的折腾,重启一下Mysql,刷新一下Wordpress的页面,Wordpress和数据库XXOO的详情就记录在案了。然后,把日志取出来,去伪存真,就是XXOO的那些SQL了。
然后,我们来分析一下,当我们打开一篇文章时,都会执行哪些SQL?
002 | SELECT option_name, option_value |
004 | WHERE autoload = 'yes' ; |
009 | WHERE option_name = 'widget_pages' |
015 | WHERE option_name = 'widget_calendar' |
021 | WHERE option_name = 'widget_nav_menu' |
029 | AND wp_posts.post_type = 'post' |
030 | ORDER BY wp_posts.post_date DESC ; |
033 | SELECT t.*, tt.*, tr.object_id |
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) |
045 | SELECT post_id, meta_key, meta_value |
047 | WHERE post_id IN (37); |
050 | SELECT p.* FROM wp_posts AS p |
051 | WHERE p.post_date < '2012-07-25 08:58:42' |
052 | AND p.post_type = 'post' |
053 | AND p.post_status = 'publish' |
054 | ORDER BY p.post_date DESC |
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 |
069 | WHERE meta_key = 'views' |
073 | UPDATE `wp_postmeta` SET `meta_value` = '5' |
075 | AND `meta_key` = 'views' ; |
080 | WHERE (post_type = 'page' |
081 | AND post_status = 'publish' ) |
082 | ORDER BY menu_order ASC ; |
085 | SELECT * FROM wp_users WHERE ID = '2' ; |
088 | SELECT user_id, meta_key, meta_value |
090 | WHERE user_id IN (2); |
093 | SELECT post_id, meta_key, meta_value |
095 | WHERE post_id IN (37); |
098 | SELECT * FROM wp_comments |
099 | WHERE comment_approved = '1' |
100 | AND comment_post_ID = 37 |
101 | ORDER BY comment_date_gmt ASC ; |
104 | SELECT * FROM wp_users WHERE ID = '1' ; |
107 | SELECT user_id, meta_key, meta_value |
109 | WHERE user_id IN (1); |
112 | SELECT DISTINCT (meta_value+0) AS views , |
113 | wp_posts.*, (meta_value+0) AS views |
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 = '' |
128 | WHERE t.meta_key = 'views' |
135 | AND wp_posts.post_type = 'post' |
136 | AND (wp_posts.post_status = 'publish' ) |
137 | ORDER BY wp_posts.post_date DESC |
141 | SELECT wp_posts.* FROM wp_posts WHERE ID IN (48); |
144 | SELECT t.*, tt.*, tr.object_id |
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) |
155 | SELECT post_id, meta_key, meta_value |
157 | WHERE post_id IN (48); |
160 | SELECT t.*, tt.*, tr.object_id |
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' ) |
168 | AND tr.object_id IN (58, 55, 49, 47, 46, 45, 39, 34) |
172 | SELECT post_id, meta_key, meta_value |
174 | WHERE post_id IN (58,55,49,47,46,45,39,34); |
179 | INNER JOIN wp_term_taxonomy AS tt |
180 | ON t.term_id = tt.term_id |
181 | WHERE tt.taxonomy IN ( 'post_tag' ) |
183 | ORDER BY tt. count DESC |
187 | SELECT YEAR (post_date) AS ` year `, |
188 | MONTH (post_date) AS ` month `, |
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 ; |
199 | INNER JOIN wp_term_taxonomy AS tt |
200 | ON t.term_id = tt.term_id |
201 | WHERE tt.taxonomy IN ( 'category' ) |
206 | SELECT YEAR ( min (post_date_gmt)) AS firstyear, |
207 | YEAR ( max (post_date_gmt)) AS lastyear |
209 | WHERE post_date_gmt > 1970; |
从SQL的记录和我的简单解析来看,还有很多地方搞的不是很清楚,以后有机会D瓜哥会借助自己制造的Wordpress源码分析工具,再分析其源代码的实现的。敬请期待!
参考资料:
- 百度百科对Wordpress的介绍
- WordPress数据库描述
- mysql 的日志的启动与查看
- 通过日志查看mysql正在执行的SQL语句
我喜欢。
很不错的分析文章。赞一个!!!
想写一个评论人信息的页面,接触了一下数据库。
里面的评论信息是一个大的表。我还以为会将用户与评论内容分开。
不知道这事为什么
没搞明白啥意思。其实Wordpress数据库结构整体还是比较简单的(链接、标签那块搞的还不是很清楚)。有机会交流交流。