`
geeksun
  • 浏览: 964999 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多

数据库的操作向来是应用的瓶颈,关注数据库的优化不仅是DBA的事情,程序员也应关注。

 

1. 使用查询缓存

使用查询缓存可减少查询次数,但注意查询时不能直接在sql中使用MySql的函数如now(),curdate()。

// 查询缓存不开启
$r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()");
 
// 开启查询缓存
$today = date("Y-m-d");
$r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'");

 

2. 选用适用的数据库引擎

如果数据量少且查询多用MyISAM,如果数据量大且更新多、需要事务支持和故障恢复,用InnoDB。

 

3. 使用explain分析sql慢查询语句

在复杂的查询语句前+explain,来查看sql查询语句如何进一步优化。

EXPLAIN SELECT * FROM city

分析结果的含义:
1)table:表名;
2)type:连接的类型,(ALL/Range/Ref)。其中ref是最理想的;
3)possible_keys:查询可以利用的索引名;
4)key:实际使用的索引;
5)key_len:索引中被使用部分的长度(字节);
6)ref:显示列名字或者"const"(不明白什么意思);
7)rows:显示MySQL认为在找到正确结果之前必须扫描的行数;
8)extra:MySQL的建议;

 

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

当知道要查询的数据只有一行时,比如根据ID查询产品,根据名字查询人

// 没有效率的:
$r = mysql_query("SELECT * FROM user WHERE country = 'China'");
if (mysql_num_rows($r) > 0) {
    // ...
}
 
// 有效率的:
$r = mysql_query("SELECT 1 FROM user WHERE country = 'China' LIMIT 1");
if (mysql_num_rows($r) > 0) {
    // ...
}

 

5. 为经常查询的字段建立索引

比如在产品表中经常查询product_name字段,就给这个字段建立一个索引

select (*) from product where product_name like 'a_%'

 

6. 在join表的时候使用相同类型的列,并且在列上建索引

在join查询的语句中,两个join的列的数据类型应该一致,并且建索引以提高查询速度

// 在state中查找company
$r = mysql_query("SELECT company_name FROM users
    LEFT JOIN companies ON (users.state = companies.state)
    WHERE users.id = $user_id");
 
// 两个 state 字段应该是被建过索引的,而且应该是相当的类型,相同的字符集。

 

7. 避免select *

从数据库中读出越多的数据,查询越慢,并且如果应用服务器和数据库服务器是两台服务器的话,增加网络数据传输的负载。

所以,应该需要什么就查询什么,按需查询。

// 不推荐
$r = mysql_query("SELECT * FROM user WHERE user_id = 1");
$d = mysql_fetch_assoc($r);
echo "Welcome {$d['username']}";
 
// 推荐
$r = mysql_query("SELECT username FROM user WHERE user_id = 1");
$d = mysql_fetch_assoc($r);
echo "Welcome {$d['username']}";

 

8. 永远为每张表设置一个ID

为每张表设置一个ID当主键,而且最好类型是INT型。

推荐使用unsigned,设置为自动增加aotu_increment.

如果使用varchar类型来当主键会造成性能下降。

 

9. 使用enum而不是varchar

enum是非常快和紧凑的,实际上保存的是tinyint,外表上显示为字符串。

像“性别”、“状态”等,这些字段的取值是有限且固定的,应用使用enum。

 

10. 从 procedure analyse()取得建议

 

11. 尽可能的使用not null

尽量将列定义为not null,这样可使数据的出来更快,所需的空间更少,而且在查询时,MySQL不需要检查是否存在特例,即null值,从而优化查询;

 

12. 使用preparedStatement 预编译语句

 

13. 字段为固定长度的表会更快

a. 使用char替代varchar,固定长度的数据处理比变长的快些;

给每个字段设置固定的长度,将被认为是static和fixed-length的,这样能提高查询性能,因为MySql能搜寻得快一些。定长的表更容易被缓存,缺点是浪费一些的空间,因为定长的字段无论你用不用,他都是要分配那么多的空间。

 

14. 垂直切割表

是把数据库的表一张变成数张,可以降低表的复杂度和字段的数目,从而达到优化的目的。

 

15. varchar类型上不要建索引

varchar列上建索引影响查询性能,当需要大量查询varchar列时,可以建全文索引(full text)在varchar列上,但表的类型需要是MyIsAM。

 

16. 使用procedure analyse()优化表的数据类型

SELECT * FROM city PROCEDURE ANALYSE(16,256)

 

17、使用tinyint(1)代表boolean值

因为boolean值在数据库中会自动转换为tinyint(1)类型。

 
18、调整硬件
1)在机器上装更多的内存;
2)增加更快的硬盘以减少I/O等待时间;
寻道时间是决定性能的主要因素,逐字地移动磁头是最慢的,一旦磁头定位,从磁道读则很快;
3)在不同的物理硬盘设备上重新分配磁盘活动;
如果可能,应将最繁忙的数据库存放在不同的物理设备上,这跟使用同一物理设备的不同分区是不同的,因为它们将争用相同的物理资源(磁头)。
 
19.更新SQL语句中,使用索引,会提高更新速度
 
20. 使用 show processlist
查看正在执行的sql情况
 
21. 尽量使用数值型字段
若只有数值信息的字段,不要设计成字符类型,因为字符类型引擎会逐个比较字符,数值则只比较一次。
 
22. 使用count(*) 而不是count(1)或count(column name)
count(*)是整个结果集有多少记录,count(column name)是整个结果集中有多少column不为空的记录。
 
 
 
分享到:
评论

相关推荐

    mysql优化笔记+资料

    以下是一份详细的MySQL优化笔记,涵盖了多个方面: 一、查询优化 1. 使用索引:为经常用于搜索的列创建索引可以显著加快查询速度。B树和哈希索引是最常见的类型,适用于不同的查询场景。 2. 避免全表扫描:尽量使用...

    mysql优化配置大全

    mysql慢可能是配置不对,阅读一下这个可能对你有帮助 ...对于Discuz!... 下面我们了解一下MySQL优化的一些基础,MySQL的优化我分为两个部分,一是服务器物理硬件的优化,二是MySQL自身(my.cnf)的优化。

    php之mysql优化

    以下将详细介绍MySQL优化的各个方面,并结合提供的文件名进行推测,尽管没有实际内容,但我们可以根据文件名来讨论可能涉及的主题。 1. **索引优化**:`mysql_rel.sql`可能包含SQL脚本,其中创建表结构和数据的关系...

    mysql优化.pdf

    在进行MySQL优化时,我们需要对数据库进行深入分析,以便找到性能瓶颈并进行相应的调整。优化可以分为三个主要部分:优化概述、查询与索引优化分析以及配置优化。 首先,在优化概述部分,了解MySQL数据库常见瓶颈是...

    MySql优化.rar

    在"MySQL优化.rar"这个压缩包中,我们很显然会接触到关于MySQL数据库优化的详细内容,这包括但不限于查询优化、索引优化、存储引擎选择、架构设计等多个方面。 首先,查询优化是MySQL性能提升的关键步骤。通过对SQL...

    mysql 优化工具.rar

    为什么要开发这个MySQL 优化工具(Why)   “一键优化”功能,可以优化本地/远程需要优化的机器,将繁琐的优化工作“傻瓜”式操作 根据您的业务需求Step By Step优化的MySQL服务器参数,起到指引的作用,简化用户...

    深入浅出的mysql优化大全

    以下是一些深入浅出的MySQL优化策略: 1. 选择合适的字段属性: 在设计数据库表时,应尽可能减小字段宽度,以减少存储空间和查询时间。例如,邮政编码字段只需设定为CHAR(6)即可,无需使用VARCHAR或更大的类型。...

    MySql优化.pdf

    MySQL优化是数据库管理中至关重要的环节,它涉及到提升查询性能、降低资源消耗,从而提高整个系统的响应速度和服务质量。MySQL自带的慢查询日志(slow query log)是进行优化的重要工具之一,它记录了执行时间超过预设...

    Mysql优化方法介绍.ppt

    MySQL 优化方法主要涵盖...总之,MySQL优化涉及多个层面,包括合理选择存储引擎、优化字段类型、建立合适索引以及编写高效的SQL语句。每个环节都对数据库性能有着直接影响,需要根据实际业务需求进行综合考虑和调整。

    MySQL优化.docx

    ### MySQL优化知识点详解 #### 一、MySQL简介 MySQL是一款由MySQL AB公司开发的开源数据库管理系统,后来该公司被Sun Microsystems收购。MySQL因其简单、高效、可靠的特点,在IT行业中迅速崭露头角,成为最受欢迎...

    MYSQL优化-一篇很好的优化文章

    21. MYSQL扩展/优化-提供更快的速度 22. MYSQL何时使用索引 23. MYSQL何时不使用索引 24. 学会使用EXPLAIN 25. 学会使用SHOW PROCESSLIST 26. 如何知晓MYSQL解决一条查询 27. MYSQL非常不错 28. MYSQL应避免...

    我的mysql 优化日记

    我的mysql优化日记 我的mysql优化日记 我的mysql优化日记 我的mysql优化日记

    MySQL优化大揭秘.rar

    MySQL优化是数据库管理中至关重要的一个环节,它旨在提高数据查询效率、降低系统资源消耗,以确保服务的稳定性和响应速度。"MySQL优化大揭秘"这个压缩包中的"SQL.pdf"很可能包含了关于如何优化MySQL数据库的详细教程...

    mysql优化-sql高级

    mysql优化从以下几个方面介绍 mysql的架构 索引优化分析 查询截取分析 mysql锁机制 主从复制

    Mysql优化 PPT

    MySQL优化是数据库管理中的关键环节,它涉及到性能提升、资源利用率优化以及系统稳定性的保障。这份"Mysql优化 PPT"可能会涵盖多个方面的内容,包括但不限于查询优化、索引策略、存储引擎选择、数据库架构设计、资源...

    大型门户网站核心技术-Mysql优化

    教程名称:大型门户网站核心技术-Mysql优化 课程目录:【】Mysql优化 资料【】Mysql优化01关键技术【】Mysql优化02表的设计【】Mysql优化03慢查询(一)【】Mysql优化04慢查询(二)【】Mysql优化05慢查询(三)【】Mysql...

    企业级MySQL优化(从引擎为你介绍怎么优化、集群方案)

    总结来说,企业级MySQL优化是一个综合性的任务,涵盖安装配置、引擎选择、算法理解、集群构建和日常维护等多个环节。通过深入理解MySQL的工作机制和优化技巧,可以有效地提升数据库性能,保障企业的业务运行。

Global site tag (gtag.js) - Google Analytics