mysql优化总结

如果大家有异议,可以在后面补充。我会随时更新的。

现在大概列出如下:(望各位补充)
1.数据库的设计
尽量把数据库设计的更小的占磁盘空间.
1).尽可能使用更小的整数类型.(mediumint就比int更合适).
2).尽可能的定义字段为not null,除非这个字段需要null.( 这个规则只适合字段为KEY的情形
3).如果没有用到变长字段的话比如varchar,那就采用固定大小的纪录格式比如char.(CHAR 总是比VARCHR快)
4).表的主索引应该尽可能的短.这样的话每条纪录都有名字标志且更高效.
5).只创建确实需要的索引。索引有利于检索记录,但是不利于快速保存记录。如果总是要在表的组合字段上做搜索,那么就在这些字段上创建索引。索引的第一部分必须是最常使用的字段.如果总是需要用到很多字段,首先就应该多复制这些字段,使索引更好的压缩。
(这条只适合MYISAM引擎的表,对于INNODB则在保存记录的时候关系不大,因为INNODB是以事务为基础的,如果想快速保存记录的话,特别是大批量的导入记录的时候
6).所有数据都得在保存到数据库前进行处理。
7).所有字段都得有默认值。
8).在某些情况下,把一个频繁扫描的表分成两个速度会快好多。在对动态格式表扫描以取得相关记录时,它可能使用更小的静态格式表的情况下更是如此。
( 具体的表现为:MYISAM表的MERGE类型,以及MYISAM和INNODB通用的分区,详情见手册)
9).不会用到外键约束的地方尽量不要使用外键。
2.系统的用途
1).及时的关闭对MYSQL的连接。
2).explain 复杂的SQL语句。( 这样能确定你的SELECT 语句怎么优化最佳
3).如果两个关联表要做比较话,做比较的字段必须类型和长度都一致.( 在数据庞大的时候建立INDEX
4).LIMIT语句尽量要跟order by或者 distinct.这样可以避免做一次full table scan.
5).如果想要清空表的所有纪录,建议用truncate table tablename而不是delete from tablename.
不过有一个问题,truncate 不会在事务处理中回滚。因为她要调用create table 语句。
Truncate Table 语句先删除表然后再重建,这个是属于文件级别的,所以自然快N多
实测例子:
song2为INNODB表。
mysql> select count(1) from song2;
+----------+
| count(1) |
+----------+
|   500000 |
+----------+
1 row in set (0.91 sec)

mysql> delete from song2;
Query OK, 500000 rows affected (15.70 sec)
mysql> truncate table song2;
Query OK, 502238 rows affected (0.17 sec)

6).能使用STORE PROCEDURE 或者 USER FUNCTION的时候.( ROUTINE总是减少了服务器端的开销
7).在一条insert语句中采用多重纪录插入格式.而且使用load data infile来导入大量数据,这比单纯的indert快好多.( 在MYSQL中具体表现为:INSERT INTO TABLEQ VALUES (),(),...();
还有就是在MYISAM表中插入大量记录的时候先禁用到KEYS后面再建立KEYS,具体表现语句:
 ALTER TABLE TABLE1 DISABLE KEYS;ALTER TABLE TABLE1 ENABLE KEYS;
而对于INNNODB 表在插入前先 set autocommit=0;完了后:set autocommit=1;这样效率比较高。
8).经常OPTIMIZE TABLE 来整理碎片.
9).还有就是date 类型的数据如果频繁要做比较的话尽量保存在unsigned int 类型比较快。
3.系统的瓶颈
1).磁盘搜索.
并行搜索,把数据分开存放到多个磁盘中,这样能加快搜索时间.
2).磁盘读写(IO)
可以从多个媒介中并行的读取数据。
3).CPU周期
数据存放在主内存中.这样就得增加CPU的个数来处理这些数据。
4).内存带宽
当CPU要将更多的数据存放到CPU的缓存中来的话,内存的带宽就成了瓶颈.
====
 Another article more about tuning details:

http://www.informit.com/articles/article.aspx?p=29406&seqNum=1

 

 

为了速度,   在确保查询已经最优的前提,   就是以牺牲空间来获取速度,   比如分表,   建立索引  
   
  我碰到以下几种情况会导致查询速度慢  
  1、无索引   ,   必要的索引可以很大地提高速度   ,   但对字符型效果不大,   查询涉及关键的类别   ,   尽量用数字,然后建立索引  
  2、效率低的SQL语句,   比如用了大量的   IN   ,   NOT   IN   (这个在MYSQL4.x好象没有   :))  
        如果有几个条件,   可以选产生结果最小的做为首次查询,   因为MYSQL   4。X不支持子查询,   可以考虑建立临时表。  
  3、数据库服务器内存太小   ,   这个你应该知道该如何办   :)  
  4、表太大,   可以根据主要分类,   把表分解   ,   或者常用的字段合成一个表,   不常用的分成一个表  
        比如全国类型的企业信息,   可以按省分,   可以按行业分,  
        按省分后,   每个省再分3个表,   地址表(名称、地址、邮政编码),企业信息表(行业,规模,。。。)   ,   通信表(电话、传真、邮件、主页)   

 

 

Mysql中有查询高速缓存,使用高速缓存的语句格式:select   sql_cache   *   from   tableA   where   ... 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值