如何提高mysql数据库的性能,因为我的网站托管在共享服务器中,并且由于“查询太多”而导致我的帐户被暂停 问题是“索引”或“缓存”或修剪我的数据库 我不知道“索引”和缓存是什么意思以及如何在php上执行此操作 感谢
答案 0 :(得分:17)
索引是什么:
将数据库表视为库 - 您拥有大量书籍(记录),每个书籍都包含相关数据(作者姓名,出版商,出版日期,ISBN,内容)。还假设这是一个非常天真的图书馆,所有书籍都按ISBN(主键)顺序搁置。就像书籍只能有一个物理排序一样,数据库表只能有一个主键索引。
现在想象有人来到图书管理员(数据库程序)并说,“我想知道图书馆里有多少Nora Roberts书籍”。要回答这个问题,图书管理员必须走过走道,看看图书馆里的每本书,这本书很慢。如果图书管理员收到这样的许多请求,那么按照作者姓名(姓名索引)设置卡片目录是值得的 - 然后他可以通过参考目录而不是走货架来更快地回答这些问题。从本质上讲,索引设置了书籍的“替代排序” - 它将它们视为按作者的字母顺序排序。
请注意:1)设置目录需要时间,2)目录占用了库中的额外空间,3)它使向图书馆添加书籍的过程变得复杂 - 而不仅仅是坚持书籍按顺序放置货架,图书管理员还必须填写索引卡并将其添加到目录中。以同样的方式,在数据库字段上添加索引可以加快查询速度,但索引本身会占用存储空间并减慢插入速度。因此,您应该只根据需要创建索引 - 索引您很少搜索的字段没有意义。
缓存是什么:
如果图书管理员有很多人进来并一遍又一遍地问同样的问题,那么在前台写下答案可能是值得的。他可以简单地说,“这是我给最后一个提出这个问题的人的答案”,而不是检查堆栈或目录。
在您的脚本中,这可能以不同的方式应用。您可以存储数据库查询或计算的结果或呈现的网页的一部分;您可以将它存储到辅助数据库表或文件或会话变量或memcached等内存服务。您可以存储预先解析的数据库查询,随时可以运行。像Smarty这样的库会自动为您存储部分或全部页面。通过存储结果并重复使用,您可以避免多次执行相同的工作。
在每种情况下,您都必须担心答案保持有效的时间。如果图书馆有新书怎么办?使用可能五分钟过时的答案是否可以?一天过时了怎么办?
缓存非常特定于应用程序;您将不得不考虑数据的含义,更改的频率,计算的成本,结果的频率。如果数据变化缓慢,最好每次更改时重新计算并存储结果;如果它经常变化但并不重要,仅当缓存的值超过一定年龄时更新可能就足够了。
答案 1 :(得分:6)
在本地设置应用程序的副本,启用mysql查询日志,并设置xdebug或其他一些分析器。开始收集数据并测试您的应用程序。有很多关于如何优化事物的指南和书籍。您必须花时间测试并收集数据首先,以便优化正确的事情。
使用您收集的数据尝试减少每页查看的查询次数,理想情况下,您应该能够在少于5-10次的查询中获得所需的一切。
查看日志,看看你是否要求两次同样的事情。在代码的一部分中请求记录是一个坏主意,然后在几行之后再次从数据库中再次请求它,除非您确定该值可能已更改。
查找嵌入在循环中的查询,并尝试重构它们,以便您进行单个查询并简单地循环结果。
您提及的 select * 表示您可能做错了。您可能应该列出您明确需要的字段。请查看此网站或Google,了解有关select * is evil。
的原因的许多好参数开始查看您的查询,然后在其上使用explain。对于经常使用的查询,请确保它们使用良好的索引而不执行全表扫描。调整开发数据库中的索引并进行测试。
答案 2 :(得分:5)
您可以查看以下几项内容:
所有这些说起来容易做起来难,但这是一个开始。
答案 3 :(得分:2)
首先,解雇你的主人,在你完全控制的环境中共享托管,并有机会适当地调整。
在您的实验室中复制该环境,理想情况下使用与生产相同的硬件;这包括像RAID控制器这样的东西。
我是否提到您需要RAID控制器。是的你是。如果没有 - 你需要一个电池支持的缓存,你就无法实现良好的写入性能。如果你没有,那么每次写入都需要物理地击中光盘,这对于性能来说是毁灭性的。
无论如何,回到阅读性能,一旦你的机器具有相同规格的RAID控制器(显然是相同的光盘),你可以尝试调整内容。
更多RAM通常是实现更好性能的最便宜方式 - 确保您已配置MySQL使用它 - 这意味着调整存储引擎特定参数。
我假设你至少拥有100G的数据;如果没有,只需购买足够的ram,你的整个数据库都适合ram,那么读取性能基本上就解决了。
其他人提到的软件更改(例如优化查询和添加索引)也很有用,但只有在您拥有一个开发硬件环境后才能有效地执行性能工作 - 即有意义地衡量应用程序的性能 - 这意味着真实硬件(不是虚拟机),与生产中使用的硬件环境一致。
哦,是的 - 还有一件事 - 甚至不想在32位操作系统上部署数据库服务器,这对于好的内存来说是一种毁灭性的浪费。
答案 4 :(得分:2)
对数据库表进行索引以加快查询速度。如果你不知道它意味着你没有。在最小值时,您应该在每个foriegn键和大多数文件中都有索引,这些索引经常在查询的where子句中使用。主键应该自动拥有索引,假设你将它们设置为开头,我不会发现那些不知道索引是什么的人。你的桌子是否正常化了?
顺便说一句,既然你在数学上做分工(为什么我没有线索),你应该使用Google整数数学。你可能得不到正确的结果。答案 5 :(得分:1)
你不应该选择*永远。而是仅选择该特定呼叫所需的数据。你的意图是什么?
order by votes*1000+((1440 - ($server_date - date))/60)2+visites600 desc
答案 6 :(得分:0)
您可能编写的查询效果不佳,和/或编写的页面编写得太多,但查询次数过多。您能否给我们定期运行您正在使用的查询的具体示例?
答案 7 :(得分:-2)
确定 这个查询来获取最后3个帖子
select * from posts where visible = 1 and date > ($server_date - 86400) and dont_show_in_frontpage = 0 order by votes*1000+((1440 - ($server_date - date))/60)*2+visites*600 desc limit 3
你觉得怎么样?