您的位置:首页 > 数据库

数据库优化

2017-11-20 15:02 78 查看
在使用数据库中的时候,有的时候,虽然查询出来自己所需要的数据,但是对于sql 语句的执行,和效率并不是很清楚,下面是一些使用数据库值得注意的地方

EXPLAIN 你的 SELECT 查询

使用 EXPLAIN 关键字可以让你知道MySQL是如何处理你的SQL语句的。这可以帮你分析你的查询语句或是表结构的性能瓶颈。

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

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

当你查询表的有些时候,你已经知道结果只会有一条结果,但因为你可能需要去fetch游标,或是你也许会去检查返回的记录数。

在这种情况下,加上 LIMIT 1 可以增加性能。这样一样,MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据。

为搜索字段建索引

索引并不一定就是给主键或是唯一的字段。如果在你的表中,有某个字段你总要会经常用来做搜索,那么,请为其建立索引吧。 当然并不是说建立了索引就一定好,索引的建立需要考虑特定的情况。不同的情况下,建立不同的索引,同时,索引需要有一定的顺序。第一个索引字段不能为空

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

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

而且,这些被用来Join的字段,应该是相同的类型的。例如:如果你要把 DECIMAL 字段和一个 INT 字段Join在一起,MySQL就无法使用它们的索引。对于那些STRING类型,还需要有相同的字符集才行。(两个表的字符集有可能不一样)

避免 SELECT *

从数据库里读出越多的数据,那么查询就会变得越慢。并且,如果你的数据库服务器和WEB服务器是两台独立的服务器的话,这还会增加网络传输的负载。 根据自己所需要的字段查询会让查询更快

永远为每张表设置一个ID

我们应该为数据库里的每张表都设置一个ID做为其主键,而且最好的是一个INT型的(推荐使用UNSIGNED),并设置上自动增加的AUTO_INCREMENT标志。 当然对于不同的数据库,自增的方式不同,需要注意的是,在oracle数据库建立自增字段需要创建触发器

使用 ENUM 而不是 VARCHAR (不同数据库可能会没有这个类型)

ENUM 类型是非常快和紧凑的。在实际上,其保存的是 TINYINT,但其外表上显示为字符串。这样一来,用这个字段来做一些选项列表变得相当的完美。

如果你有一个字段,比如“性别”,“民族”,“状态”或“部门”,你知道这些字段的取值是有限而且固定的,那么,你应该使用 ENUM 而不是 VARCHAR。

尽可能的使用 NOT NULL

固定长度的表会更快

如果表中的所有字段都是“固定长度”的,整个表会被认为是 静态的 或 固定长度的。

固定长度的表会提高性能,因为MySQL搜寻得会更快一些,因为这些固定的长度是很容易计算下一个数据的偏移量的,所以读取的自然也会很快。而如果字段不是定长的,那么,每一次要找下一条的话,需要程序找到主键。

并且,固定长度的表也更容易被缓存和重建。不过,唯一的副作用是,固定长度的字段会浪费一些空间,因为定长的字段无论你用不用,都是要分配那么多的空间。

拆分大的 DELETE 或 INSERT 语句

如果你有一个大的处理语句,可以将其拆分,使用 LIMIT 条件是一个好的方法

越小的列会越快

对于大多数的数据库引擎来说,硬盘操作可能是最重大的瓶颈。所以,将的数据变得紧凑会对这种情况非常有帮助,这可以减少了对硬盘的访问。

还有一个需要说的是,在使用数据库查询数据的时候,尽可能还是使用Prepared Statements 具体的好处
a8a2
在另外一篇文章里面有讲到
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: