美文网首页
sql的相关优化

sql的相关优化

作者: houxin | 来源:发表于2020-03-27 10:12 被阅读0次

    一、某些数据库的函数会禁用mysql本身的查询缓存

    例如,数据库中出现CURDATE(),NOW() 和 RAND() 或是其它的诸如此类的SQL函数都不会开启查询缓存

    如果使用缓存的话,可以使用变量代替这种函数结构。

    二、可以再数据表前面加上EXPLAIN参数进而帮助自己分析sql语句的查询性能。

    可以借助phpmyadmin更清晰的查看数据表运行的更多细节。

    EXPLAIN 的查询结果还会告诉你你的索引主键被如何利用的,你的数据表是如何被搜索和排序的……等等,等等。

    三、当只要一行数据时使用 LIMIT 1

    四、索引并不一定就是给主键或是唯一的字段。

    如果在你的表中,有某个字段你总要会经常用来做搜索,那么,请为其建立索引吧。

    另外,你应该也需要知道什么样的搜索是不能使用正常的索引的。例如,当你需要在一篇大的文章中搜索一个词时,如: “WHERE post_content LIKE ‘%apple%'”,索引可能是没有意义的。你可能需要使用MySQL全文索引 或是自己做一个索引(比如说:搜索关键词或是Tag什么的)

    五、在Join表的时候使用相当类型的例,并将其索引

    如果你的应用程序有很多 JOIN 查询,你应该确认两个表中Join的字段是被建过索引的。这样,MySQL内部会启动为你优化Join的SQL语句的机制。

    六、千万不要 ORDER BY RAND()

    如果你真的想把返回的数据行打乱了,你有N种方法可以达到这个目的。这样使用只让你的数据库的性能呈指数级的下降。

    七、避免 SELECT *

    八、永远为每张表设置一个ID

    我们应该为数据库里的每张表都设置一个ID做为其主键,而且最好的是一个INT型的(推荐使用UNSIGNED),并设置上自动增加的AUTO_INCREMENT标志。

    九、使用 ENUM 而不是 VARCHAR

    你知道这些字段的取值是有限而且固定的,那么,你应该使用 ENUM 而不是 VARCHAR。

    十、从 PROCEDURE ANALYSE() 取得建议

    在phpmyadmin中的表现为,查看表结构,表下面有个字段显示是"规划表结构",这里会给你一些关于表的一些建议。仅供参考,只有表的数据比较大的时候,这些建议才会变的准确,否则可以不采纳。

    十一、尽可能的使用 NOT NULL

    十二、垂直分割

    十三、拆分大的 DELETE 或 INSERT 语句

    对于牵涉到大批量的更新和删除的操作时候,可以分批处理 ,处理完一批,休息一下,然后继续。

    例如:

    while (1) {
        //每次只做1000条
        mysql_query("DELETE FROM logs WHERE log_date <= '2009-11-01' LIMIT 1000");
        if (mysql_affected_rows() == 0) {
            // 没得可删了,退出!
            break;
        }
        // 每次都要休息一会儿
        usleep(50000);
    }
    

    十四、选择合适的存储引擎

    MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直到读操作完成。另外,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的。

    InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。他是它支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。

    相关文章

      网友评论

          本文标题:sql的相关优化

          本文链接:https://www.haomeiwen.com/subject/kodfuhtx.html