如果你真的想把返回的数据行打乱了,你有 N 种方法可以达到这个目的 。这样使用只让你的数据库的性能呈指数级的下降 。这里的问题是:MySQL 会不得不去执行 RAND()函数(很耗 CPU 时间),而且这是为了每一行记录去记行,然后再对其排序 。就算是你用了 Limit 1 也无济于事(因为要排序)
下面的示例是随机挑一条记录
文章插图
7.避 免 SELECT *
从数据库里读出越多的数据,那么查询就会变得越慢 。并且,如果你的数据库服务器和 WEB 服务器是两台独立的服务器的话,这还会增加网络传输的负载 。
【MySQL 性能优化的 21 个最佳实践】所以,你应该养成一个需要什么就取什么的好的习惯 。
文章插图
8.永远为每张表设置一个 ID
我们应该为数据库里的每张表都设置一个 ID 做为其主键,而且最好的是一个 INT 型的(推荐使用 UNSIGNED),并设置上自动增加的 AUTO_INCREMENT 标
志 。
就算是你 users 表有一个主键叫 “email”的字段,你也别让它成为主键 。使用 VARCHAR 类型来当主键会使用得性能下降 。另外,在你的程序中,你应该使用表的 ID 来构造你的数据结构 。
而且,在 MySQL 数据引擎下,还有一些操作需要使用主键,在这些情况下,主键的性能和设置变得非常重要,比如,集群,分区……
在这里,只有一个情况是例外,那就是“关联表”的“外键”,也就是 说,这个表的主键,通过若干个别的表的主键构成 。我们把这个情况叫做“外
键” 。比如:有一个“学生表”有学生的 ID,有一个“课程表”有课程 ID,那么,“成绩表”就是“关联表”了,其关联了学生表和课程表,在成绩表中,学生 ID 和课程 ID 叫“外键”其共同组成主键 。
9.使用 ENUM 而不是 VARCHAR
ENUM 类型是非常快和紧凑的 。在实际上,其保存的是 TINYINT,但其外表上显示为字符串 。这样一来,用这个字段来做一些选项列表变得相当的完美 。
如果你有一个字段,比如“性别”,“国家”,“民族”,“状态”或
“部门”,你知道这些字段的取值是有限而且固定的,那么,你应该使用 ENUM
而不是 VARCHAR 。
MySQL 也有一个“建议”(见第十条)告诉你怎么去重新组织你的表结构 。当你有一个 VARCHAR 字段时,这个建议会告诉你把其改成 ENUM 类型 。使用PROCEDURE ANALYSE() 你可以得到相关的建议 。
10.从 PROCEDURE ANALYSE() 取得建议
PROCEDURE ANALYSE() 会让 MySQL 帮你去分析你的字段和其实际的数据,并会给你一些有用的建议 。只有表中有实际的数据,这些建议才会变得有用,因为要做一些大的决定是需要有数据作为基础的 。
例如,如果你创建了一个 INT 字段作为你的主键,然而并没有太多的数据,那么,PROCEDURE ANALYSE()会建议你把这个字段的类型改成 MEDIUMINT。或是你使用了一个 VARCHAR 字段,因为数据不多,你可能会得到一个让你把它改成 ENUM 的建议 。这些建议,都是可能因为数据不够多,所以决策做得就不够准 。
在 phpmyadmin 里,你可以在查看表时,点击 “Propose table structure” 来查看这些建议
文章插图
一定要注意,这些只是建议,只有当你的表里的数据越来越多时,这些建议才会变得准确 。一定要记住,你才是最终做决定的人 。
11.尽可能的使用 NOT NULL
除非你有一个很特别的原因去使用 NULL 值,你应该总是让你的字段保持NOT NULL 。这看起来好像有点争议,请往下看 。
首先,问问你自己“Empty”和“NULL”有多大的区别(如果是 INT,那就是 0 和 NULL)?如果你觉得它们之间没有什么区别,那么你就不要使用 NULL 。(你知道吗?在 Oracle 里,NULL 和 Empty 的字符串是一样的!)
不要以为 NULL 不需要空间,其需要额外的空间,并且,在你进行比较的时候,你的程序会更复杂 。当然,这里并不是说你就不能使用 NULL 了,现实情况是很复杂的,依然会有些情况下,你需要使用 NULL 值 。
12.Prepared Statements
Prepared Statements 很像存储过程,是一种运行在后台的 SQL 语句集合,我们可以从使用 prepared statements 获得很多好处,无论是性能问题还是安全问题 。
推荐阅读
- 如何进行网站301优化?网站301优化要注意什么?
- WordPress建站系统的运行速度优化
- mysql数据库常用语句总结
- C语言如何操作MySQL数据库?
- 如何提升 CSS 性能的小知识
- MySQL数据库中,同样是删除数据,truncate与delete语句的区别
- 详解MySQL数据库JSON类型--用法、意义、内置函数
- 一份实用的mysql数据库规范,值得收藏
- 教你如何优雅地用Python连接MySQL数据库
- 游戏显卡天梯排行榜 显卡性能排行