专栏首页IT大咖说2018年,让你的数据库变更快的十个建议

2018年,让你的数据库变更快的十个建议

摘要

大多数网站的内容都存在数据库里,用户通过请求来访问内容。数据库非常的快,有许多技巧能让你优化数据库的速度,使你不浪费服务器的资源。在这篇文章中,我收录了十个优化数据库速度的技巧。

1、小心设计数据库

第一个技巧也许看来理所当然,但事实上大部分数据库的问题都来自于设计不好的数据库结构。

譬如我曾经遇见过将客户端信息和支付信息储存在同一个数据库列中的例子。对于系统和用数据库的开发者来说,这很糟糕。

新建数据库时,应当将信息储存在不同的表里,采用标准的命名方式,并采用主键。

来源: http://www.simple-talk.com/sql/database-administration/ten-common-database-design-mistakes/

2、清楚你需要优化的地方

如果你想优化某个查询语句,清楚的知道这个语句的结果是非常有帮助的。采用 EXPLAIN 语句,你将获得很多有用的信息,下面来看个例子:

EXPLAIN SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column;

来源: http://dev.mysql.com/doc/refman/5.0/en/using-explain.html

3、最快的查询语句… 是那些你没发送的语句

每次你向数据库发送一条语句,你都会用掉很多服务器资源。所以在很高流量的网站中,最好的方法是将你的查询语句缓存起来。

有许多种缓存语句的方法,下面列出了几个:

AdoDB: AdoDB 是一个 PHP 的数据库简化库。使用它,你可以选用不同的数据库系统 (MySQL, PostGreSQL, Interbase 等等),而且它就是为了速度而设计的。AdoDB 提供了简单但强大的缓存系统。还有,AdoDB 拥有 BSD 许可,你可以在你的项目中免费使用它。对于商业化的项目,它也有 LGPL 许可。

Memcached:Memcached 是一种分布式内存缓存系统,它可以减轻数据库的负载,来加速基于动态数据库的网站。

CSQL Cache: CSQL 缓存是一个开源的数据缓存架构。我没有试过它,但它看起来非常的棒。

4、不要 select 你不需要的

获取想要的数据,一种非常常见的方式就是采用 * 字符,这会列出所有的列。

SELECT * FROM wp_posts;

然而,你应该仅列出你需要的列,如下所示。如果在一个非常小型的网站,譬如,一分钟一个用户访问,可能没有什么分别。然而如果像 Cats Who Code 这样大流量的网站,这就为数据库省了很多事。

SELECT title, excerpt, author FROM wp_posts;

5、采用 LIMIT

仅获得某个特定行数的数据是非常常见的。譬如博客每页只显示十篇文章。这时,你应该使用 LIMIT,来限定你想选定的数据的行数。

如果没有 LIMIT,表有 100,000 行数据,你将会遍历所有的行数,这对于服务器来说是不必要的负担。

SELECT title, excerpt, author FROM wp_posts LIMIT 10;

6、避免循环中的查询

当在 PHP 中使用 SQL 时,可以将 SQL 放在循环语句中。但这么做给你的数据库增加了负担。

下面的例子说明了 “在循环语句中嵌套查询语句” 的问题:

foreach ($display_order as $id => $ordinal){     
     $sql = "UPDATE categories SET display_order = $ordinal WHERE id = $id";
     mysql_query($sql); 
 }

你可以这么做:

UPDATE categories
     SET display_order = CASE id 
         WHEN 1 THEN 3
         WHEN 2 THEN 4
         WHEN 3 THEN 5    
  END WHERE id IN (1,2,3)

来源: http://www.karlrixon.co.uk/articles/sql/update-multiple-rows-with-different-values-and-a-single-sql-query/

7、采用 join 来替换子查询

程序员可能会喜欢用子查询,甚至滥用。下面的子查询非常有用:

SELECT a.id,
         (SELECT MAX(created)
          FROM posts
          WHERE author_id = a.id) 
   AS latest_post FROM authors a

虽然子查询很有用,但 join 语句可以替换它,join 语句执行起来更快。

SELECT a.id, MAX(p.created) AS latest_post

   FROM authors a
    INNER JOIN posts p
      ON (a.id = p.author_id)
   GROUP BY a.id

来源: http://20bits.com/articles/10-tips-for-optimizing-mysql-queries-that-dont-suck/

8、小心使用通配符

通配符非常好用,在搜索数据的时候可以用通配符来代替一个或多个字符。我不是说不能用,而是,应该小心使用,并且不要使用全词通配符 (full wildcard),前缀通配符或后置通配符可以完成相同的任务。

事实上,在百万数量级的数据上采用全词通配符来搜索会让你的数据库当机。

#Full wildcard

   SELECT * FROM TABLE WHERE COLUMN LIKE '%hello%';    #Postfix wildcard

  SELECT * FROM TABLE WHERE COLUMN LIKE  'hello%';  #Prefix wildcard

  SELECT * FROM TABLE WHERE COLUMN LIKE  '%hello';

来源: http://hungred.com/useful-information/ways-optimize-sql-queries/

9、采用 UNION 来代替 OR

下面的例子采用 OR 语句来:

SELECT * FROM a, b WHERE a.p = b.q or a.x = b.y;

UNION 语句,你可以将 2 个或更多 select 语句的结果拼在一起。下面的例子返回的结果同上面的一样,但是速度要快些:

SELECT * FROM a, b WHERE a.p = b.q 
    UNION 
    SELECT * FROM a, b WHERE a.x = b.y

来源: http://www.bcarter.com/optimsql.htm

10. 使用索引

数据库索引和你在图书馆中见到的索引类似:能让你更快速的获取想要的信息,正如图书馆中的索引能让读者更快的找到想要的书一样。

可以在一个列上创建索引,也可以在多个列上创建。索引是一种数据结构,它将表中的一列或多列的值以特定的顺序组织起来。

下面的语句在 Product 表的 Model 列上创建索引。这个索引的名字叫作 idxModel

CREATE INDEX idxModel ON Product (Model);

今天的分享就到这里,谢谢大家!

本文转载自:http://geek.csdn.net/news/detail/249705

本文分享自微信公众号 - IT大咖说(itdakashuo)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-01-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 产品研发做到又快又好的一个核心原则

    内容来源:2018 年 5 月 19 日,G7汇通天下技术合伙人廖强在“PHPCon China 2018 技术峰会”进行《敏捷工程实践与自动化》演讲分享。IT...

    IT大咖说
  • Java程序员必须了解的JVM性能调优知识,全都在这里了

    传引用的错觉是如何造成的呢?在运行栈中,基本类型和引用的处理是一样的,都是传值,所以,如果是传引用的方法调用,也同时可以理解为“传引用值”的传值调用,即引用的处...

    IT大咖说
  • 一文通晓私有云构建之道

    摘要 服务化在云计算中是非常重要的部分,所有组件以服务的方式去提供,而很多企业的数据库都还在构建当中。今天聊的就是私有云数据库构建的过程。如果大家有这方面的打算...

    IT大咖说
  • 通过存储过程进行分页查询的SQL示例

    跟着阿笨一起玩NET
  • MySQL性能调优金字塔

    本文介绍的三种调优方法是按照金字塔的调优顺序排列的,如下图所示。一般来说,自底向上调优的效果是成反比的,而越往下层调优效果越好,但是难度也越大。

    用户1682855
  • FPGA Xilinx Zynq 系列(三)

    今天给大侠带来FPGA Xilinx Zynq 系列第三篇,本篇内容目录简介如下:

    FPGA技术江湖
  • Transact-SQL系统函数

    CAST 和 CONVERT函数是将一种数据类型的表达式转换为另一种数据类型的表达式。

    fireWang
  • 黑客声称窃取GitHub 500GB源代码,准备不出售直接泄露

    “我们已经成功入侵微软的GitHub私人储存库,并从中窃取了500GB的数据,本来打算在暗网上出售的,现在改变主意了,打算免费发布。”

    FB客服
  • Pytorch神器(11)

    看上去这么乱乱的图就是目标检测应用的输出了,简单说,目标检测的任务就是输入一张图片或者一帧图像,通过一系列计算,使得输出是这样的一个可视化结果或一个等同于这种可...

    刀刀老高
  • 推荐一个优化分页查询的办法(分页数很大的情况)

    SELECT SQL_NO_CACHE * FROM erp_orders ORDER BY id LIMIT 300000,10;

    用户7657330

扫码关注云+社区

领取腾讯云代金券