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

1、小心设计数据库

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

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

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

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

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

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

EXPLAINSELECT*FROMref_table,other_tableWHEREref_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*FROMwp_posts;

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

SELECTtitle, excerpt, authorFROMwp_posts;

5、采用 LIMIT

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

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

SELECTtitle, excerpt, authorFROMwp_posts LIMIT 10;

6、避免循环中的查询

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

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

foreach ($display_orderas$id => $ordinal){

$sql = "UPDATE categories SET display_order = $ordinal WHERE id = $id";

mysql_query($sql);

}

你可以这么做:

UPDATEcategories

SETdisplay_order =CASEid

WHEN1THEN3

WHEN2THEN4

WHEN3THEN5

ENDWHEREidIN(1,2,3)

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

7、采用 join 来替换子查询

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

SELECTa.id,

(SELECTMAX(created)

FROMposts

WHEREauthor_id = a.id)

ASlatest_postFROMauthors a

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

SELECTa.id,MAX(p.created)ASlatest_post

FROMauthors a

INNERJOINposts p

ON(a.id = p.author_id)

GROUPBYa.id

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

8、小心使用通配符

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

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

#Fullwildcard

SELECT*FROMTABLEWHERECOLUMNLIKE'%hello%';    #Postfix wildcard

SELECT*FROMTABLEWHERECOLUMNLIKE'hello%';  #Prefix wildcard

SELECT*FROMTABLEWHERECOLUMNLIKE'%hello';

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

9、采用 UNION 来代替 OR

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

SELECT*FROMa, bWHEREa.p = b.qora.x = b.y;

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

SELECT*FROMa, bWHEREa.p = b.q

UNION

SELECT*FROMa, bWHEREa.x = b.y

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

10. 使用索引

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

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

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

CREATEINDEXidxModelONProduct (Model);

【编辑推荐】

【责任编辑:庞桂玉 TEL:(010)68476606】

点赞 0

2018年跨行学习mysql_2018年,让你的数据库变更快的十个建议相关推荐

  1. 2018年强化学习领域十篇重要论文(附源码)

    2019-06-06 09:47:57 来自网络 与其他机器学习方法相比,比如监督式学习.迁移学习.甚至非监督式学习学习相比,深度强化学习方法极其需要大量数据,而且常常不稳定,从性能上来说可能不是最好 ...

  2. 大牛预测2018年深度学习走向:大批AI硬件初创将失败

    来源:智东西 导语:本文作者Carlos E. Perez是Intuition Machine公司的创始人,曾经编写<人工直觉与深度学习手册>( Artificial Intuition ...

  3. Java开发2018年值得学习的10大技术

    转载自 Java开发2018年值得学习的10大技术 作为一个开发人员,我们最大的挑战就是保持自己了解新的技术.技术变化很快,你大概每两年就会看到一个新版本的编程语言和框架. 就拿2017年来说,AR. ...

  4. 大数据告诉你:2018年该学习什么技术

    前几天,数据科学家Julia Silge在Stack Overflow官方博客上分享了一组分析数据,他在文中揭示了快速增长的技术,快速衰落的技术,稳步增长的技术.我们从中可以看到,2018年你学习什么 ...

  5. 打脸!2018年深度学习发展速度被严重高估

    打脸!2018年深度学习发展速度被严重高估 https://mp.weixin.qq.com/s/JaqEbgcJA0VCyL6Zt_xUgg 策划编辑 | Debra 作者 | Carlos E. ...

  6. 如何跨行学习前端?一个小白的跨行之路~

    如何跨行学习前端?一个小白的跨行之路~ 此篇文章讲述了一个小白跨行学习前端过程遇到的问题,以及是如何解决的.希望此篇文章能够帮助到更多的人. 前端小白该如何入门?(先给大家分享**干货**最后在讲故事 ...

  7. 我在51CTO微职位学软考——2018网规学习心得

    我在51CTO微职位学软考--2018网规学习心得 - 2018年7月报班学习软考网络规划师,想通过考试获得高级职称的资格,也是对自己技术的一种肯定吧.虽然说国家的资格证书或许在小公司作用不大,但是稍 ...

  8. python画春节_过年,大家都在集五福,程序员整理了2018年python学习路线及方法...

    Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年.像Perl语言一样, Pytho ...

  9. 数据库学习day_01:SQL的发展和数据库操作相关sql语句

    1.数据库 学习数据库主要学习的就是如何对数据进行增删改查操作. 增加(插入数据) 删除数据 修改数据 查询数据 为什么使用数据库软件? 之前在webserver时通过IO技术已经操作过数据,其实这部 ...

最新文章

  1. 【转载】用开源软件搭建企业内部协作平台, Kill QQ MSN
  2. HTML5文档结构 摘要
  3. android ConcurrentHashMap的使用
  4. 后端开发应该掌握的 Redis 基础
  5. 四年级信息技术认识计算机,四年级信息技术第三课信息工具知多少
  6. linux java -xms_为什么JVM比指定的-Xms消耗更少的内存?
  7. python巩固函数和模块_Python学习教程6:函数,模块和类的使用
  8. 怀念童年啊!周二下午没有动画片……
  9. 2017.9.4 栅栏 失败总结
  10. linux top功能,[每日一题]说说Linux top命令的功能和用法
  11. maven五:查找jar包坐标,选择jar包版本
  12. OpenWrt Image Builder 制作带插件的HG255D固件记录
  13. 手机端网页切图之间出现空白的问题
  14. 蜂鸣器驱动电路 自主开发设计
  15. matlab符号函数绘图法_MATLAB符号运算实验
  16. html tbody增加行,使用jquery向表的tbody添加行
  17. SOM网络--机器学习(郑捷 著)
  18. 网站建设视频教程,史上最精,最全。
  19. 弱小和无知不是生存的障碍,傲慢才是
  20. 车铣复合UG编程 UG车铣编程视频教程 UG车铣复合视频教程

热门文章

  1. 美光扭转下滑趋势:收入增加亏损减少
  2. CentOS通过日志反查入侵
  3. 书评 —— 《Go语言编程》
  4. 正则表达式测试工具、网页版
  5. maven集成tomcat进行web应用测试
  6. lua 循环语句 实例
  7. java安全编码实践总结
  8. windows tracert 命令 查看路由表
  9. printf/scanf格式控制符的完整格式
  10. 构建Hadoop伪分布式环境