我该怎么做才能使mysql 100%达到最佳状态?

时间:2009-12-23 16:02:18

标签: php mysql optimization

最近我用php + mysql做了一个很大的项目。现在我关心我的mysql。我该怎么做才能使我的mysql尽可能最佳?告诉你所知道的一切,我会非常感激。

第二个问题,我每页加载一个mysql查询,它从mysql获取信息。这是一个非常大的查询,因为我通过连接从几个表中获取信息。也许我应该做点什么?

谢谢。

7 个答案:

答案 0 :(得分:16)

来自MySQL Performance tips forge

的一些重要提示

特定查询效果

  1. 使用EXPLAIN来分析查询 执行计划
  2. 使用慢速查询日志(始终拥有它) 上!)
  3. 当你有或时,不要使用DISTINCT 可以使用GROUP BY Insert 性能
  4. 批量插入和替换
  5. 使用LOAD DATA而不是INSERT
  6. LIMIT m,n可能没有它那么快 声音
  7. 如果您使用ORDER BY RAND() 有> ~2K记录
  8. 使用SQL_NO_CACHE 选择经常更新的数据或 大量数据
  9. 在LIKE开始时避免使用通配符 查询
  10. 避免使用相关子查询  select和where子句(尝试  避免in)
  11. 扩展效果提示:

    1. 使用基准
    2. 隔离工作负载不会让管理工作干扰客户的性能。 (即备份)
    3. 调试很糟糕,测试岩石!
    4. 随着数据的增长,索引可能会发生变化(基数和选择性变化)。结构化可能想要改变。使您的架构与代码一样模块化。使您的代码能够扩展。计划并拥抱变革,并让开发人员也这样做。
    5. 网络效果提示:

      1. 仅通过获取所需内容来最大限度地减少流量。      1.分页/分块数据检索限制      2.不要使用SELECT *      3.如果更长的查询可以更有效,请注意许多小的快速查询
      2. 如果合适,请使用multi_query以减少往返次数
      3. 使用存储过程以避免带宽浪费
      4. 操作系统性能提示:

        1. 使用正确的数据分区      1.对于群集。在需要之前开始考虑Cluster
        2. 使数据库主机尽可能保持干净。你真的需要在该服务器上使用窗口系统吗?
        3. 利用操作系统的优势
        4. 削减cron脚本
        5. 创建测试环境

答案 1 :(得分:3)

学习使用解释工具。

答案 2 :(得分:2)

三件事:

  1. 联接不一定是次优的。通常,使用连接的模式将比实现相同但避免表连接的模式更快。重要的是要知道你的连接是最佳的。 EXPLAIN非常有用,但您还需要了解索引的工作原理。

  2. 如果您在每次点击时都从数据库中获取数据,请考虑缓存系统是否适合您。如果是,请查看PHP memcachememcached。它很容易在PHP中使用,速度非常快。它很受欢迎。

  3. 返回mysql:确保密钥缓冲区的大小正确。您还可以考虑为应保留在缓存中的关键索引使用专用密钥缓冲区。阅读CACHE INDEXLOAD INDEX INTO CACHE。另请参阅here

答案 3 :(得分:1)

“...因为我从一些表中获取信息并加入了”

加入,甚至“大”加入也不错。只要确保你有好的索引。

另请注意,具有几条记录的性能与具有数十万条记录的性能有很大不同,因此请进行相应的测试。

答案 4 :(得分:0)

为了表现,本书很好:High Perofmanace MYSQLassociated blog也很好。

答案 5 :(得分:0)

我的2cents:将你的log_slow_queries设置为< 2sec并使用mysqlsla(从hackmysql.com获取)来分析'慢'查询...这样你就可以深入了解较慢的查询...

(mysqlsla也可以从log-queries-not-using-indexes选项中受益)

  • 在mysqlhack.com上有一个名为'mysqlreport'的脚本,它可以估算你的安装是如何运行的......(一旦它运行一段时间),并且还指出了更准确地调整你的设置的位置... < / LI>

答案 6 :(得分:0)

完美是一个挑战,而不是第一个设定自己的目标。

启用所有查询的mysql日志记录,并编写一些解析日志文件的代码,并从SQL语句中删除任何文字值。

e.g。变化

SELECT * FROM atable WHERE something=5 AND other='splodgy';

SELECT * FROM atable WHERE something=1 AND other='zippy';

类似于:

SELECT * FROM atable WHERE something=:1 AND other=:2;

(对不起,我没有得到这样做的代码 - 但这不是火箭科学)

然后将重写的日志推送到表中,以便根据执行的长度和频率确定性能修正的优先级。