分类 生活 下的文章

非常实用的12个WordPress数据库维护SQL语句

下面假设 WordPress 数据库的表的前缀都是默认的“wp_”。具体用时可根据自己的数据库后缀名进行相应的字段修改。

1. 直接在数据库中修改密码

密码忘记了是经常的事情,博客密码忘记了进不去,可以直接在数据库里面修改:

UPDATE wp_users SET user_pass = MD5('PASSWORD') WHERE user_login ='admin'

 

上面采用了 MySQL 的 MD5() 函数讲密码转成 MD5 Hash。

2. 将日志从一个作者转移到另外一个

假如你的博客的某个作者离开了,或者你不想让“admin”作为作者名,想把日志的作者从一个改到另外一个:

UPDATE wp_posts SET post_author=NEW_AUTHOR_ID WHERE post_author=OLD_AUTHOR_ID;

 

*注:你需要知道两个作者的 user id。

3. 删除数据库中日志修订记录和其相关的 post_meta 数据

特别是针对多人博客的时候,日志修订功能很重要,但是日志修订功能也在数据库里面添加了很多的数据,假设你的博客只有 100 篇日志,每篇日志有 10 个日志修订,你的 posts 表中就会有超过 1000 条记录,严重的数据冗余:

DELETE a,b,c FROM wp_posts a LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id) LEFT JOIN wp_postmeta c ON (a.ID = c.post_id) WHERE a.post_type ='revision'

 

*注:上面的 SQL 将删除数据库中所有的日志修订记录和其相关的 meta 信息(自定义字段)。

4. 批量删除垃圾留言

如果你一段时间没有管理你的博客,刚好出去休假,没有办法上网,并且博客也没有装类似 Akismet 这类防垃圾留言插件,那么你回来的时候,你会发现博客后台有成千上万条垃圾留言需要你去审核。

这个时候,其实你只需要审核通过正常的留言,然后执行下面这条 SQL:

DELETE FROM wp_comments WHERE comment_approved ='0';

 

5. 查找没用的标签

你可能创建一些 WordPress 标签之后,就没有再使用,你可以通过下面这条 SQL 找到它们,然后安全的删除他们。

SELECT *From wp_terms wt INNER JOIN wp_term_taxonomy wtt ON wt.term_id=wtt.term_id WHERE wtt.taxonomy='post_tag' AND wtt.count=0;

 

6. 查找和替换数据

对于熟悉 MySQL 数据库的开发者来说,replace() 这个 MySQL 函数都应该很熟悉,它可以让你指定一个字段,然后替换它里面的字符串,一旦执行,所有这个字段里面的字符串都会被替换。对于 WordPress 博客来说,这个 SQL 则非常实用,它可以让你批量修改某些输入错误,或者某个邮件地址等等。

UPDATE table_name SET field_name = replace( field_name,'string_to_find','string_to_replace');

 

替换日志内容中字符串:

UPDATE wp_posts SET post_content = replace( post_content,'string_to_find','string_to_replace');

 

将某个留言者地址替换下:

UPDATE wp_comments SET comment_author_url = REPLACE( comment_author_url,'http://oldurl.com','http://newurl.com');

 

留言者邮箱:

UPDATE wp_comments SET comment_author_email = REPLACE( comment_author_email,'old-email@address.com','new-email@address.com');

 

还有一个 WordPress 插件 Search & Replace 还提供一个后台让你更加容易进行批量替换。

7. 获取所有留言者的邮件地址

有时候你想做点不是那么好的事情,比如给所有留言者发下邮件,告诉他们你博客做了一些新的功能,或者写了一个很不错的文章,那么你干坏事情之前,首先要获取所有留言者的邮件地址:

SELECT DISTINCT comment_author_email FROM wp_comments;

 

*注:上面的 DISTINCT 让你获取的邮件地址是唯一的,即使这个用户发过好几次留言,也不怕。

不过群发邮件这件事情个人建议还是不要这样做好。 

8. 一次把所有插件都停了

网站出现问题了,需要一次把插件全部都先停了之后检测下:

UPDATE wp_options SET option_value ='' WHERE option_name ='active_plugins';

 

9. 删除没用的标签

没用的标签当然要删除了:

DELETE a,b,c
FROM
wp_terms AS a
LEFT JOIN wp_term_taxonomy AS c ON a.term_id = c.term_id
LEFT JOIN wp_term_relationships AS b ON b.term_taxonomy_id = c.term_taxonomy_id
WHERE (
c.taxonomy ='post_tag' AND
c.count =0
);

 

*注:上面 SQL 除了删除所有没用的标签,还删除了所有标签分类模式信息以及和日志关联的关系。

10. 列出没用的 post meta

wp_postmeta 中的数据是由一些插件或者自定义字段生成的,他是对 wp_posts 表的一种无限的扩展,但是可能由于某种原因,日志被删除了,但是它的 meta 信息还存在 wp_postmeta 表中,下面这条 SQL 将这些没有关联日志的 meta 数据列出:

SELECT * FROM wp_postmeta pm LEFT JOIN wp_posts wp ON wp.ID = pm.post_id WHERE wp.ID IS NULL;

 

11. 关闭旧日志留言功能

厄,对于一些技术博客或者其他博客来说,一些旧日志的内容可能已经过时了,但是一些读者,还是对一些问题“纠缠不清”或者“喋喋不休”,怎么办,把留言关了就好了:

关闭留言:

UPDATE wp_posts SET comment_status ='closed' WHERE post_date <'2009-01-01' AND post_status ='publish';

 

关闭Trackback:

UPDATE wp_posts SET ping_status="closed" WHERE post_date <'2009-01-01' AND post_status ='publish';

 

12. 删除所有 url 含有特定字符串的留言

一些留言者很烦,一次留几十个,其链接都指定到一些卖伟哥,起重机,SEO 的站点,烦人的很,一个一个删,又累,下面这条 SQL 可以来帮忙:

DELETE from wp_comments WHERE comment_author_url LIKE "%viagra%";

 

简单总结

这些 SQL 语句是直接对数据库进行操作的,如果你不是那么懂数据库或者 SQL 语言,建议你不要这么做,如果你还是比较自信 SQL 操作,建议操作之前备份下数据库。

 

wordpress入门基础:wordpress文件系统结构详细介绍

根目录
|
|

wp-admin — wp-content — wp-includes
|                    |        |_________________________________________
|                    |________________________                                                         |
|                                                                     |                                                        |

css — images — includes — js — maint       languages — plugins — themes         images — js — pomo — Text — theme-compat
|
Diff
|
Engine — Renderer

 

 

根目录

1.index.php:WordPress核心索引文件,即博客输出文件。

2.license.txt:WordPress GPL许可证文件。

3.my-hacks.php:定义了博客输出之前处理的追加程序。默认安装中并没有这个文件,但如果存在,它就会被管理页面引用。

4.readme.html:WordPress安装导言。

5.wp-atom.php:输出Atom信息聚合内容。

6.wp-blog-header.php:根据博客参数定义博客页面显示内容。

7.wp-cron.php

8.wp-comments-post.php:接收评论,并把其添加到数据库。

9.wp-commentsrss2.php:用来生成日志评论的RSS2信息聚合内容。

10.wp-config-sample.php:把WordPress连接到MySQL数据库的示例配置文件。

11.wp-config.php:这是真正把WordPress连接到MySQL数据库的配置文件。默认安装中虽不包括它,但由于WordPress运行需要这一文件,因此,用户需要编辑这个文件以更改相关设置。

12.wp-feed.php:根据请求定义feed类型并其返回feed请求文件。

13.wp-links-opml.php:生成OPML格式的链接(通过WordPress管理菜单添加)列表。

14.wp-login.php:定义注册用户的登陆页面。

15.wp-mail.php:用来获取通过邮件提交的博文。这个文件的URL通常被添加到cron任务中,这样cron就会定期检索文件并接收邮件日志。

16.wp-pass.php:审核受密码保护文章的密码并显示被保护文章。

17.wp-rdf.php:生成RDF信息聚合内容。

18.wp-register.php:允许新用户通过联机表单注册用户名。

19.wp-rss.php:生成RSS信息聚合内容。

20.wp-rss2.php:生成RSS2信息聚合内容。

21.wp-settings.php:运行执行前的例行程序,包括检查安装是否正确,使用辅助函数,应用用户插件,初始化执行计时器等等。

22.wp-trackback.php:处理trackback请求。

23.wp.php:显示博客日志的简单模板。并没有什么神奇之处,但包括了部分index.php内容。

24.xmlrpc.php:处理xmlrpc请求。用户无需通过内置的网络管理界面就可发布文章。

wp-admin

1.wp-admin/admin.php:管理文件的核心文件。用来连接数据库,整合动态菜单数据,显示非核心控制页面等。

2.wp-admin/admin-db.php

3.wp-admin/admin-footer.php:定义所有管理控制台的页脚。

4.wp-admin/admin-functions.php:定义了管理控制台使用的多种函数。5.wp-admin/admin-header.php:定义了管理控制台的上半部分内容,包括菜单逻辑 (menu logic)的 menu-header.php文件。

6.wp-admin/bookmarklet.php:使用书签功能时,定义弹出页面。撰写日志时使用默认的edit-form.php文件。

7.wp-admin/categories.php:定义管理页面的类别管理。参考: Manage – Categories

8.wp-admin/cat-js.php

9.wp-admin/edit.php:定义管理页面的日志管理。参考:  Manage – Posts

10.wp-admin/edit-comments.php:定义管理页面的评论管理。参考:  Manage – Comments

11.wp-admin/edit-form-advanced.php:定义管理页面的日志高级编辑形式管理,包括post.php。参考:  Write – Write Post – Advanced

12.wp-admin/edit-form.php:定义管理页面的日志简单编辑形式管理,包括post.php。参考:  Write – Write Post

13.wp-admin/edit-form-comment.php:编辑特定日志评论。

14.wp-admin/edit-form-ajax-cat.php

15.wp-admin/edit-link-form.php

16.wp-admin/edit-page-form.php:定义管理模块页面的页面编辑,包括post.php和page-new.php。参考: Write – Write Page

17.wp-admin/edit-pages.php:定义管理模块页面的页面管理。参考:  Manage – Pages

18.wp-admin/execute-pings.php

19.wp-admin/import.php

20.wp-admin/index.php:默认管理页面。根据用户请求显示相应的页面。

21.wp-admin/inline-uploading.php

22.wp-admin/install-helper.php:定义数据库维护函数,包括popular-in-plugins maybe_create_table() 和maybe_add_column()。

23.wp-admin/install.php:安装WordPress。

24.wp-admin/link-add.php:链接添加。参考:  Links – Add Link

25.wp-admin/link-categories.php:链接分类管理。参考: Links – Link Categories

26.wp-admin/link-import.php:导入链接。参考: Links – Import Links

27.wp-admin/link-manager.php:链接管理。参考:  Links – Manage Links

28.wp-admin/link-parse-opml.ph:导入链接时,用来解析OPML文件。

29.wp-admin/list-manipulation.js

30.wp-admin/list-manipulation.php

31.wp-admin/menu-header.php:用于在管理界面显示菜单。

32.wp-admin/menu.php:定义了默认管理菜单结构。

33.wp-admin/moderation.php:定义了评论审核函数。

34.wp-admin/options.php:升级后,用来更改所有设置。

35.wp-admin/options-discussion.php:管理评论和trackback相关选项。参考:  Options – Discussion

36.wp-admin/options-general.php:管理基本配置选项。参考: Options – General

37.wp-admin/options-head.php

38.wp-admin/options-misc.php:设置文件上传,链接跟踪,自定义”hacks”等相关选项。参考:Options – Miscellaneous

39.wp-admin/options-permalink.php:管理永久链接选项。参考: Options – Permalinks

40.wp-admin/options-reading.php:设置如何把网站信息发送到读者浏览器或其它应用程序。参考: Options – Reading

41.wp-admin/options-writing.php:管理日志撰写界面。参考:Options – Writing

42.wp-admin/page-new.php:创建新页面。

43.wp-admin/plugin-editor.php:编辑插件文件。

44.wp-admin/plugins.php:管理插件。

45.wp-admin/post.php:创建新日志。

46.wp-admin/profile-update.php

47.wp-admin/profile.php:管理个人资料或配置。

48.wp-admin/setup-config.php:安装时,用来创建wp-config.php文件。

49.wp-admin/sidebar.php

50.wp-admin/templates.php:编辑服务器可写文件。

51.wp-admin/theme-editor.php:编辑特定主题中的文件。

52.wp-admin/themes.php:管理主题。

53.wp-admin/update-links.php

54.wp-admin/upgrade-functions.php:定义了版本升级函数。

55.wp-admin/upgrade-schema.php:定义了升级中使用的默认表格结构和选项。

56.wp-admin/upgrade.php:版本升级。

57.wp-admin/user-edit.php:编辑用户。

58.wp-admin/users.php:管理用户。

59.wp-admin/wp-admin.css:定义了管理控制台的默认样式表。

60.wp-admin/xfn.js

wp-includes

1.wp-includes/cache.php

2.wp-includes/capabilities.php

3.wp-includes/class-IXR.php:Incutio XML-RPC库。包括了 XML RPC支持函数。由http://scripts.incutio.com/xmlrpc/提供支持。

4.wp-includes/classes.php:包括了基本的类,如核心文章提取机制WP_Query和改写管理WP_Rewrite。

5.wp-includes/class-pop3.php:包括了支持使用POP邮箱的类。可供wp-mail.php 使用。

6.wp-includes/class-snoopy.php:Snoopy是一个PHP类,用来模仿Web浏览器的功能,它能自动完成检索网页和发送表单的任务。

7.wp-includes/comment-functions.php

8.wp-includes/default-filters.php

9.wp-includes/feed-functions.php

10.wp-includes/functions-compat.php:即新版本PHP中用来支持老版本PHP的函数文件。

11.wp-includes/functions-formatting.php:用于清理XHTML和用特定字符集正确格式化文本。

12.wp-includes/functions-post.php:定义了在数据库中管理日志,查询用户权限,提取和撰写评论等函数。

13.wp-includes/functions.php:包含许多重要的支持函数,它是WordPress中最大的文件,函数数量几乎是第二大文件的两倍。

14.wp-includes/gettext.php:PHP-gettext GPL 翻译库组成部分。

15.wp-includes/kses.php:用来渲染和过滤日志或评论中的HTML。

16.wp-includes/links.php:用来管理和使用WordPress的链接功能。

17.wp-includes/locale.php:用来替代默认的星期和月份值。

18.wp-includes/pluggable-functions.php

19.wp-includes/registration-functions.php

20.wp-includes/rss-functions.php

21.wp-includes/streams.php:定义了包装文件流和字符流的类。

22.wp-includes/template-functions-author.php:包含了与日志作者或评论人相关的主题函数。

23.wp-includes/template-functions-category.php:包含了与类别相关的主题函数。

24.wp-includes/template-functions-comment.php:包含了与评论相关的主题函数。

25.wp-includes/template-functions-general.php:包含了常规主题函数。

26.wp-includes/template-functions-links.php:包含了与链接相关的主题函数。

27.wp-includes/template-functions-post.php:包含了与日志相关的主题函数。

28.wp-includes/template-functions.php:包含了以上所有”template-”文件。

29.wp-includes/template-loader.php

30.wp-includes/vars.php:用来设置杂项变量。

31.wp-includes/version.php:用来设置当前使用的WordPress版本。

32.wp-includes/wp-db.php:包含了用来连接MySQL数据库的函数。

33.wp-includes/wp-l10n.php:提供支持多语言版本的函数。

 

InnoDB 还是 MyISAM?

MyISAM存储引擎

       MyISAM是 默认存储引擎。它基于更老的ISAM代码,但有很多有用的扩展。MyISAM存储引擎的一些特征:
·      所有数据值先存储低字节。这使得数据机和操作系统分离。二进制轻便性的唯一要求是机器使用补码(如最近20年的机器有的一样)和IEEE浮点格式(在主流机器中也完全是主导的)。唯一不支持二进制兼容性的机器是嵌入式系统。这些系统有时使用特殊的处理器。

·        先存储数据低字节并不严重地影响速度;数据行中的字节一般是未联合的,从一个方向读未联合的字节并不比从反向读更占用更多的资源。服务器上的获取列值的代码与其它代码相比并不显得时间紧。

·        大文件(达63位文件长度)在支持大文件的文件系统和操作系统上被支持。

·         当把删除和更新及插入混合的时候,动态尺寸的行更少碎片。这要通过合并相邻被删除的块,以及若下一个块被删除,就扩展到下一块来自动完成。

·         每个MyISAM表最大索引数是64。 这可以通过重新编译来改变。每个索引最大的列数是16个。

·         最大的键长度是1000字节。这也可以通过编译来改变。对于键长度超过250字节的情况,一个超过1024字节的的键块被用上。

·         BLOB和TEXT列可以被索引。

·         NULL值被允许在索引的列中。这个占每个键的0-1个字节。

·         所有数字键值以高字节为先被存储以允许一个更高地索引压缩。

·        当记录以排好序的顺序插入(就像你使用一个AUTO_INCREMENT列之时),索引树被劈开以便高节点仅包含一个键。这改善了索引树的空间利用率。

·         每表一个AUTO_INCREMEN列的内部处理。MyISAM为INSERT和UPDATE操作自动更新这一 列。这使得AUTO_INCREMENT列更快(至少10%)。在序列顶的值被删除之后就不能再利用。(当AUTO_INCREMENT列被定义为多列索 引的最后一列,可以出现重使用从序列顶部删除的值的情况 )。AUTO_INCREMENT值可用ALTER TABLE或myisamch来重置。

·         如果数据文件中间的表没有自由块了,在其它线程从表读的同时,你可以INSERT新行到表中。(这被认识为并发操作 )。自由块的出现是作为删除行的结果,或者是用比当前内容多的数据对动态长度行更新的结果。当所有自由块被用完(填满),未来的插入又变成并发。

·         你可以把数据文件和索引文件放在不同目录,用DATA DIRECTORY和INDEX DIRECTORY选项CREATE TABLE以获得更高的速度。

·         每个字符列可以又不同的字符集。

·         在MyISAM索引文件里又一个标志,它表明表是否被正确关闭。如果用–myisam-recover选项启动mysqld,MyISAM表在打开得时候被自动检查,如果被表被不恰当地关闭,就修复表。

·         如果你用–update-state选项运行myisamchk,它标注表为已检查。myisamchk –fast只检查那些没有这个标志的表。

·         myisamchk –analyze为部分键存储统计信息,也为整个键存储统计信息。

·         myisampack可以打包BLOB和VARCHAR列。

MyISAM也支持下列特征:

·         支持true VARCHAR类型;VARCHAR列以存储在2个字节中的长度来开始。

·         有VARCHAR的表可以有固定或动态记录长度。

·         VARCHAR和CHAR列可以多达64KB。

·         一个被搞乱的已计算索引对可对UNIQUE来使用。这允许你在表内任何列的合并上有UNIQUE。(尽管如此,你不能在一个UNIQUE已计算索引上搜索)。

InnoDB存储引擎

InnoDB给MySQL提供 了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非 锁定读。这些特色增加 了多用户部署和性能。没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常小的空间。InnoDB也支持FOREIGN KEY强制。在SQL查询中,你可以自由地将InnoDB类型的表与其它MySQL的表的类型混合起来,甚至在同一个查询中也可以混合。InnoDB是为处理巨大数据量时的最大性能设计。它的CPU效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的。

InnoDB存储引擎被完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。 InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始磁盘分区)。这与MyISAM表不同,比如在MyISAM表中每个表被存在 分离的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上。

InnoDB默认地被包含在MySQL二进制分发中。Windows Essentials installer使InnoDB成为Windows上MySQL的 默认表。

InnoDB被用来在众多需要高性能的大型数据库站点上产生。著名的Internet新闻站点Slashdot.org运行在 InnoDB上。Mytrix, Inc.在InnoDB上存储超过1TB的数据,还有一些其它站点在InnoDB上处理平均每秒800次插入/更新的负荷。

InnoDB和MyISAM的区别

区别概述:

MyISAM 是MySQL中默认的存储引擎,一般来说不是有太多人关心这个东西。决定使用什么样的存储引擎是一个很tricky的事情,但是还是值我们去研究一下,这里的文章只考虑 MyISAM 和InnoDB这两个,因为这两个是最常见的。

下面先让我们回答一些问题:

  • 你的数据库有外键吗?
  • 你需要事务支持吗?
  • 你需要全文索引吗?
  • 你经常使用什么样的查询模式?
  • 你的数据有多大?

 

思考上面这些问题可以让你找到合适的方向,但那并不是绝对的。如果你需要事务处理或是外键,那么InnoDB 可能是比较好的方式。如果你需要全文索引,那么通常来说 MyISAM是好的选择,因为这是系统内建的,然而,我们其实并不会经常地去测试两百万行记录。所以,就算是慢一点,我们可以通过使用Sphinx从 InnoDB中获得全文索引。

数据的大小,是一个影响你选择什么样存储引擎的重要因素,大尺寸的数据集趋向于选择InnoDB方式,因为其支持事务处理和故障恢复。数据库的在小 决定了故障恢复的时间长短,InnoDB可以利用事务日志进行数据恢复,这会比较快。而MyISAM可能会需要几个小时甚至几天来干这些事,InnoDB 只需要几分钟。

您操作数据库表的习惯可能也会是一个对性能影响很大的因素。比如: COUNT() 在 MyISAM 表中会非常快,而在InnoDB 表下可能会很痛苦。而主键查询则在InnoDB下会相当相当的快,但需要小心的是如果我们的主键太长了也会导致性能问题。大批的inserts 语句在MyISAM下会快一些,但是updates 在InnoDB 下会更快一些——尤其在并发量大的时候。

所以,到底你检使用哪一个呢?根据经验来看,如果是一些小型的应用或项目,那么MyISAM 也许会更适合。当然,在大型的环境下使用MyISAM 也会有很大成功的时候,但却不总是这样的。如果你正在计划使用一个超大数据量的项目,而且需要事务处理或外键支持,那么你真的应该直接使用InnoDB方 式。但需要记住InnoDB 的表需要更多的内存和存储,转换100GB 的MyISAM 表到InnoDB 表可能会让你有非常坏的体验。

区别总结:

1.InnoDB不支持FULLTEXT类型的索引。
2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。
3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”

 

提升InnoDB性能的方法:

MyISAM和InnoDB存储引擎性能差别并不是很大,针对InnoDB来说,影响性能的主要是 innodb_flush_log_at_trx_commit 这个选项,如果设置为1的话,那么每次插入数据的时候都会自动提交,导致性能急剧下降,应该是跟刷新日志有关系,设置为0效率能够看到明显提升,当然,同 样你可以SQL中提交“SET AUTOCOMMIT = 0”来设置达到好的性能。另外,还听说通过设置innodb_buffer_pool_size能够提升InnoDB的性能,但是我测试发现没有特别明显 的提升。

基本上我们可以考虑使用InnoDB来替代我们的MyISAM引擎了,因为InnoDB自身很多良好的特点,比如事务支持、存储 过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多,当然,相应的在my.cnf中的配置也是比较关键 的,良好的配置,能够有效的加速你的应用。
任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。

MyISAM InnoDB 区别

MyISAM 和 InnoDB 讲解

  InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。

  以下是一些细节和具体实现的差别:

  ◆1.InnoDB不支持FULLTEXT类型的索引。

  ◆2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。

  ◆3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。

  ◆4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。

  ◆5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

  另外,InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”

  两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁.而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用。

  我作为使用MySQL的用户角度出发,Innodb和MyISAM都是比较喜欢的,但是从我目前运维的数据库平台要达到需求:99.9%的稳定性,方便的扩展性和高可用性来说的话,MyISAM绝对是我的首选。

  原因如下:

  1、首先我目前平台上承载的大部分项目是读多写少的项目,而MyISAM的读性能是比Innodb强不少的。

  2、MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小。

  3、从平台角度来说,经常隔1,2个月就会发生应用开发人员不小心update一个表where写的范围不对,导致这个表没法正常用了,这个时候MyISAM的优越性就体现出来了,随便从当天拷贝的压缩包取出对应表的文件,随便放到一个数据库目录下,然后dump成sql再导回到主库,并把对应的binlog补上。如果是Innodb,恐怕不可能有这么快速度,别和我说让Innodb定期用导出xxx.sql机制备份,因为我平台上最小的一个数据库实例的数据量基本都是几十G大小。

  4、从我接触的应用逻辑来说,select count(*) 和order by 是最频繁的,大概能占了整个sql总语句的60%以上的操作,而这种操作Innodb其实也是会锁表的,很多人以为Innodb是行级锁,那个只是where对它主键是有效,非主键的都会锁全表的。

  5、还有就是经常有很多应用部门需要我给他们定期某些表的数据,MyISAM的话很方便,只要发给他们对应那表的frm.MYD,MYI的文件,让他们自己在对应版本的数据库启动就行,而Innodb就需要导出xxx.sql了,因为光给别人文件,受字典数据文件的影响,对方是无法使用的。

  6、如果和MyISAM比insert写操作的话,Innodb还达不到MyISAM的写性能,如果是针对基于索引的update操作,虽然MyISAM可能会逊色Innodb,但是那么高并发的写,从库能否追的上也是一个问题,还不如通过多实例分库分表架构来解决。

  7、如果是用MyISAM的话,merge引擎可以大大加快应用部门的开发速度,他们只要对这个merge表做一些select count(*)操作,非常适合大项目总量约几亿的rows某一类型(如日志,调查统计)的业务表。

  当然Innodb也不是绝对不用,用事务的项目如模拟炒股项目,我就是用Innodb的,活跃用户20多万时候,也是很轻松应付了,因此我个人也是很喜欢Innodb的,只是如果从数据库平台应用出发,我还是会首选MyISAM。

  另外,可能有人会说你MyISAM无法抗太多写操作,但是我可以通过架构来弥补,说个我现有用的数据库平台容量:主从数据总量在几百T以上,每天十多亿 pv的动态页面,还有几个大项目是通过数据接口方式调用未算进pv总数,(其中包括一个大项目因为初期memcached没部署,导致单台数据库每天处理 9千万的查询)。而我的整体数据库服务器平均负载都在0.5-1左右。

WordPress登陆文件wp-login.php添加相关参数,安全有保障

只需要在主题的funtions.php 的最后一个 ?> 前文件添加以下代码就可以了:

//wp-login.php添加相关参数 devework.com
add_action('login_enqueue_scripts','login_protection');
function login_protection(){
    if($_GET['love'] != 'someone')header('Location: http://www.dammit.hk/');
}

 

按照上面的代码,你的WordPress 登陆地址应该是 http://域名/wp-login.php?love=someone 。?love=someone就是参数名,这段代码的作用大概就是通过获取文件头,如果没有参数?love=someone,那么就跳转到http://www.dammit.hk/。

你可以修改的地方就是第四行的 love、someone以及http://www.dammit.hk/。

这样一来,安全性就大大提高了。而且不要向上次的那样修改WordPress本身的代码,只需要在主题那里添加就可以了。

2025 年 5 月
 1234
567891011
12131415161718
19202122232425
262728293031  

广告

分类

近期评论

标签

历史上的今天

归档