数据库的操作向来是应用的瓶颈,关注数据库的优化不仅是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)类型。
相关推荐
mysql慢可能是配置不对,阅读一下这个可能对你有帮助 ...对于Discuz!... 下面我们了解一下MySQL优化的一些基础,MySQL的优化我分为两个部分,一是服务器物理硬件的优化,二是MySQL自身(my.cnf)的优化。
mysql优化
mysql优化及基础面试题。 什么是慢查询 慢查询日志,顾名思义,就是查询慢的日志,是指 mysql 记录所有执行超过 long_query_time 参数设定的时间阈值的 SQL 语句的日志。该日志能为 SQL 语句的优化带来很好的帮助...
为什么要开发这个MySQL 优化工具(Why) “一键优化”功能,可以优化本地/远程需要优化的机器,将繁琐的优化工作“傻瓜”式操作 根据您的业务需求Step By Step优化的MySQL服务器参数,起到指引的作用,简化用户...
MySql优化
MySQL优化
21. MYSQL扩展/优化-提供更快的速度 22. MYSQL何时使用索引 23. MYSQL何时不使用索引 24. 学会使用EXPLAIN 25. 学会使用SHOW PROCESSLIST 26. 如何知晓MYSQL解决一条查询 27. MYSQL非常不错 28. 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的架构 索引优化分析 查询截取分析 mysql锁机制 主从复制
教程名称:大型门户网站核心技术-Mysql优化 课程目录:【】Mysql优化 资料【】Mysql优化01关键技术【】Mysql优化02表的设计【】Mysql优化03慢查询(一)【】Mysql优化04慢查询(二)【】Mysql优化05慢查询(三)【】Mysql...
Mysql优化方法介绍.ppt
windows平台mysql优化配置
MySql优化——MySql 优化.doc
MySql优化.pdf
深入浅出的mysql优化大全!网易数据库专家写的
经典案例实例分析,通过演示教你掌握基本的mysql优化
非常实用的mysql优化规则,问题:,若是能够恰当的使用sql规则,便能极大提高系统的效率。那么如何实现sql语句和表的优化呢?