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,在里面找到下面高亮的一行,然后增加一行日志记录。修改后的代码如下:
# 这行配置是配置错误日志的输出文件 log_error = "mysql_error.log" # 下面是新增的日志文件 log = "mysql.log"
根据D瓜哥的个人经验,有两点需要说明一下:
- 有些参考资料显示,日志路径可以随意配置。但是D瓜哥配置到了C盘,没有成功。所以,建议大家配置到和错误日志一样的路径即可。今天D瓜哥又想到,可能MySQL没有在C盘下的创建文件的权限吧。
- 如上配置的话,日志文件应该在%MySQL_HOME%\data\目录下。建议大家在这里根据配置文件中日志文件的名称,创建一个空文件。否则,MySQL会自动创建,这样可能会出现无法复制的情况。(当复制这个日志文件时,需要管理员权限;而且,在D瓜哥试验的时候,关闭数据库,这个日志文件就好自动被删除。)
经过上面的折腾,重启一下Mysql,刷新一下Wordpress的页面,Wordpress和数据库XXOO的详情就记录在案了。然后,把日志取出来,去伪存真,就是XXOO的那些SQL了。
然后,我们来分析一下,当我们打开一篇文章时,都会执行哪些SQL?
-- 启动时,加载一些必要的参数 SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes'; -- ?这个是干嘛的? SELECT option_value FROM wp_options WHERE option_name = 'widget_pages' LIMIT 1; -- ?这个又是干嘛的? SELECT option_value FROM wp_options WHERE option_name = 'widget_calendar' LIMIT 1; -- ?这个是干嘛啊? SELECT option_value FROM wp_options WHERE option_name = 'widget_nav_menu' LIMIT 1; -- 打开某一篇文章时,查询文件的内容。 SELECT wp_posts.* FROM wp_posts WHERE 1=1 AND wp_posts.ID = 37 AND wp_posts.post_type = 'post' ORDER BY wp_posts.post_date DESC; -- 查询文章对应的Tag、Category以及Post Format SELECT t.*, tt.*, tr.object_id FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON tt.term_id = t.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ('category', 'post_tag', 'post_format') AND tr.object_id IN (37) ORDER BY t.name ASC; -- 查询一个文章对应的Meta,会根据按照的插件的不同,结果有所不同。 -- 从这里也可以看出一些插件的存储。 SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (37); -- 查询上一篇文章的内容,用于显示时下一篇的链接和Title。 SELECT p.* FROM wp_posts AS p WHERE p.post_date < '2012-07-25 08:58:42' AND p.post_type = 'post' AND p.post_status = 'publish' ORDER BY p.post_date DESC LIMIT 1; -- 查询上一篇文章的内容,用于显示时上一篇的链接和Title。 SELECT p.* FROM wp_posts AS p WHERE p.post_date > '2012-07-25 08:58:42' AND p.post_type = 'post' AND p.post_status = 'publish' ORDER BY p.post_date ASC LIMIT 1; -- ?没搞清楚这个是干嘛的?! SELECT meta_id FROM wp_postmeta WHERE meta_key = 'views' AND post_id = 37; -- 更新阅读次数。安装了wp-postviews才有。 UPDATE `wp_postmeta` SET `meta_value` = '5' WHERE `post_id` = 37 AND `meta_key` = 'views'; -- 查询需要显示的Page SELECT * FROM wp_posts WHERE (post_type = 'page' AND post_status = 'publish') ORDER BY menu_order ASC; -- 查询文章的作者信息。用于显示作者名和链接。 SELECT * FROM wp_users WHERE ID = '2'; -- 查询文章的作者信息的Meta。 SELECT user_id, meta_key, meta_value FROM wp_usermeta WHERE user_id IN (2); -- 查询文章的Meta。因为按照的插件不同,结果可能会有不同。 SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (37); -- 查询文章对应的评论 SELECT * FROM wp_comments WHERE comment_approved = '1' AND comment_post_ID = 37 ORDER BY comment_date_gmt ASC; -- ?没搞清除这个干嘛的? SELECT * FROM wp_users WHERE ID = '1'; -- ?没搞清除这个干嘛的? SELECT user_id, meta_key, meta_value FROM wp_usermeta WHERE user_id IN (1); -- 查出最受欢迎的十篇文章。安装了wp-postviews,开启相应的Widget才有。 SELECT DISTINCT (meta_value+0) AS views , wp_posts.*, (meta_value+0) AS views FROM wp_posts LEFT JOIN wp_postmeta ON wp_postmeta.post_id = wp_posts.ID WHERE post_date < '2012-12-24 23:42:10' AND post_type = 'post' AND post_status = 'publish' AND meta_key = 'views' AND post_password = '' ORDER BY views DESC LIMIT 10; -- 查询文章的阅读次数 SELECT meta_value FROM wp_postmeta t WHERE t.meta_key = 'views' AND t.post_id = 37; -- ?没搞清除这个干嘛的? SELECT wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish') ORDER BY wp_posts.post_date DESC LIMIT 0, 10; -- ?没搞清除这个干嘛的? SELECT wp_posts.* FROM wp_posts WHERE ID IN (48); -- 查询文章对应的Tag、Category以及Post Format SELECT t.*, tt.*, tr.object_id FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON tt.term_id = t.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ('category', 'post_tag', 'post_format') AND tr.object_id IN (48) ORDER BY t.name ASC; -- 查询文章对应的Meta SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (48); -- ?这个是干嘛的? SELECT t.*, tt.*, tr.object_id FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON tt.term_id = t.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ('category', 'post_tag', 'post_format') -- 下面这些ID从何而来? AND tr.object_id IN (58, 55, 49, 47, 46, 45, 39, 34) ORDER BY t.name ASC; -- ?没搞清干啥用? SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (58,55,49,47,46,45,39,34); -- 查询标签云 SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy IN ('post_tag') AND tt.count > 0 ORDER BY tt.count DESC LIMIT 45; -- 查询每个月的文章总数 SELECT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC; -- 查询文章分类 SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy IN ('category') AND tt.count > 0 ORDER BY t.name ASC; -- ?这是干嘛啊? SELECT YEAR(min(post_date_gmt)) AS firstyear, YEAR(max(post_date_gmt)) AS lastyear FROM wp_posts WHERE post_date_gmt > 1970;
从SQL的记录和我的简单解析来看,还有很多地方搞的不是很清楚,以后有机会D瓜哥会借助自己制造的Wordpress源码分析工具,再分析其源代码的实现的。敬请期待!
参考资料:
原文链接:https://wordpress.diguage.com/archives/83.html
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
我喜欢。
很不错的分析文章。赞一个!!!
想写一个评论人信息的页面,接触了一下数据库。
里面的评论信息是一个大的表。我还以为会将用户与评论内容分开。
不知道这事为什么
没搞明白啥意思。其实Wordpress数据库结构整体还是比较简单的(链接、标签那块搞的还不是很清楚)。有机会交流交流。