`
geeksun
  • 浏览: 954107 次
  • 性别: 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慢可能是配置不对,阅读一下这个可能对你有帮助 ...对于Discuz!... 下面我们了解一下MySQL优化的一些基础,MySQL的优化我分为两个部分,一是服务器物理硬件的优化,二是MySQL自身(my.cnf)的优化。

    php之mysql优化

    mysql优化

    mysql优化及基础面试题

    mysql优化及基础面试题。 什么是慢查询 慢查询日志,顾名思义,就是查询慢的日志,是指 mysql 记录所有执行超过 long_query_time 参数设定的时间阈值的 SQL 语句的日志。该日志能为 SQL 语句的优化带来很好的帮助...

    mysql 优化工具.rar

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

    MySql优化.rar

    MySql优化

    MySQL优化大揭秘.rar

    MySQL优化

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

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

    我的mysql 优化日记

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

    mysql优化笔记+资料

    详细介绍了mysql的优化方法,资料包里包含word文档,ppt和图片

    mysql优化十大技巧

    mysql优化技巧mysql优化技巧mysql优化技巧mysql优化技巧mysql优化技巧mysql优化技巧mysql优化技巧mysql优化技巧mysql优化技巧mysql优化技巧mysql优化技巧mysql优化技巧mysql优化技巧mysql优化技巧mysql优化技巧mysql...

    mysql优化-sql高级

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

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

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

    Mysql优化方法介绍.ppt

    Mysql优化方法介绍.ppt

    windows平台mysql优化配置

    windows平台mysql优化配置

    MySql 优化.doc

    MySql优化——MySql 优化.doc

    MySql优化.pdf

    MySql优化.pdf

    深入浅出的mysql优化大全

    深入浅出的mysql优化大全!网易数据库专家写的

    2h拿下MySQL优化.pdf

    经典案例实例分析,通过演示教你掌握基本的mysql优化

    非常实用的mysql优化规则

    非常实用的mysql优化规则,问题:,若是能够恰当的使用sql规则,便能极大提高系统的效率。那么如何实现sql语句和表的优化呢?

Global site tag (gtag.js) - Google Analytics