mysql 优化

1.为查询缓存优化你的查询
2.EXPLAIN你的SELECT查询
3.当只要一行数据时使用LIMIT1
4.为搜索字段建索引
5.在Join表的时候使用相当类型的例,并将其索引(两个表中Join的字段是被建过索引的, 而且,这些被用来Join的字段,应该是相同的类型的。对于那些STRING类型,还需要有相同的字符集才行。两个表的字符集有可能不一样)
6.千万不要ORDER BY RAND()
7.避免 SELECT *
8.永远为每张表设置一个ID
9.使用ENUM而不是VARCHAR
10.从PROCEDURE ANALYSE()取得建议p程序员站
11.尽可能的使用NOT NULL
12. Prepared Statements
13.无缓冲的查询
14.把IP地址存成UNSIGNED INT
15.固定长度的表会更快( VARCHAR,TEXT,BLOB。只要你包括了其中一个这些字段,那么这个表就不是“固定长度静态表”了,这样,MySQL 引擎会用另一种方法来处理)
16.垂直分割
17.mysql多条件查询的优化(1)适当的建立字段索引。(2)注意sql条件的顺序,把能够排除掉大量数据的条件写在前面

mysql军规
1、字段部分内容替换:update shop_cms_content set dy_Html=replace(dy_Html,'http://www.hyj.com','http://topic.hyj.com')
2、mysql军规---------------------------------------------------------------------------------------------------------------------------------
1、核心军规
1、尽量不在数据库中做运算;2、复杂的运算移动程序端cpu;3、尽量简单的应用mysql;4、一年的数据量预估(纯int不超过1000w,含char不超过500w,注:合理分表不超载)
5、单数据库不要超过300~400个表;6、表字段少而精(IO高效、全表遍历、表修复快、提高并非、alert table快),单行不超过200byte,单表不超过20纯int字段,单表不超过20char(10)字段,注:单表字段数上线控制在20~50个
7、数据库并发像城市交通——非线性增长,拒绝3B(大sql、大事物、大批量);
总结:1、尽量不在数据库做运算;2、控制单表数据量;3、保持表身段苗条;4、平衡范式与冗余;5、拒绝3b。

2、字段类军规
1、槽糕的定义字段(int(1),int(11),bigint auto_increment, decimal(18,0));2、数字型vs字符串型索引比较:更高兴、查询快、占用空间更小;3用无符号int存储ip而非char(15)
4、优先使用enum或set(字符串、可能值已知且有限);5、存储enum占用1字节,转为数值运算,set视节点定,最多占用8字节,比较时,需要加'单引号,,如:·sex· enum ('f','m') comment '性别';6、避免使用null字段(很难进行查询优化,null列加索引,需要额外空间,含null复合索引无效,如:·c· int(10) not null default 0;
7、text类型处理性能远低于varchar*(强制生成硬盘临时表,浪费更多的空间,varchar(65535)==》64k(utf-8));8、尽量不用text、blob数据类型,如必须使用则拆分到单独的
总结:1、用好的数值字段类型;2、将字符转化为数字;3、优先使用枚举enum、set;4、避免使用null;5、少用并拆分text和blob;6、不在数据库中存图片;

3、索引类军规
1、谨慎合理添加索引(改善查询、减慢更新、索引不是越多越好);2、能不加索引的尽量不加(综合评估数据密度和数据分布,最好不要超过字段的20%);3、综合核心sql优先考虑覆盖索引;4、区分度(单字母:26,4字母 26*26*26*26);
5、字符必须建前缀索引(·pinyin· varchar(100) default null comment 、小区拼音、,key ’idx_pinyin‘(’pinyin‘(8)),)engin=innodb;6、不要在索引列进行数学运算和函数运算(无法使用索引、导致全表扫描,如:select * from 表1 where id +1=6630913 \g 1 row in set (51.62sec)select * from 表1 where id =6630913-1 \g 1 row in set (0.00sec));
7、对主见建立聚簇索引;8、二级索引存储主键值;9、按自增顺序插入值;10、忌用字符串做主键;11、聚簇索引分裂;12、线上oltp系统(外键可节省开发量,有额外的开销、逐行操作、可到达其他表,意味着锁、高并发容易死锁);
总结:1、谨慎合理添加索引;2、字符必须建前缀索引;3、不在索引列做;4、自增列或全局id做innodb主见;5、尽量不用外键;
4、sql类军规
1、大sqlvs多个简单的sql(一条sql只能在一个cpu上运算,一条大sql就把整个数据库堵死);2、拒绝大sql,拆解多条简单的sql(简单的sql缓存命中率更高、减少锁表时间,特别是myisam,用上多cpu);3、保持事物/db连接短小精悍(事物/连接使用原则:即开即用,用完机关,与事物无关的操作房子事物外面,减少锁资源的占用,不破坏一致性前提下使用多个短事务代替常事物);4、尽量少用村粗过程、尽量少用触发器、减用使用mysql函数对结果进行处理;
5、不用select *,更消耗cpu,内存、io网络带宽;6、同一个字段将or改写为in(),注意控制in的个数;7、不同字段将or改为union(select name from class where classid=1 union select name from class where techer=2);8、避免负向查询(not、!=、<>、!<、!>、not exists 、not in、not like);9、避免%前缀模糊查询;
10、count(*)资源开销很大尽量少用;11、计数统计(实时统计:用mencache,双向更新、凌晨跑基准,非实时统计:尽量用单独统计表,定期重算);12、分页(传统:select * from table limit 10000,10(偏移量越大则越慢)推荐分页:selext * from table where id》23423 limit 11);13、高并发db不建议进行两个表以上的join,适当分解链接保证高并发;
总结:sql语句尽可能简单,保持食物短小,尽可能使用sp/trig/func,尽量不用select * 改写or语句,避免向查询和%前缀模糊,减少count(*),limit的高效分页,用union all而非union,分解链接保证高并发,group by取出排序
同数据类型的列值比较 load data导数据、打散批量更新、know enery sql
5、约定类军规
1、原则:线上连线上,线下连线线下(实时数据用real库,模拟环境用sim库,测试用qa库,开发用dev库);2、mysql子查询(查询中有select):大部分优化较差,特别是where中使用in id的字查询;3、永远不要在程序端对数据库显示加锁(外部锁对数据库不可控,高并发时是灾难,极难调试和排查);
4、并发扣款等一致性问题(采用事物,相对值修改,commit前二次较验冲突);5、统一字符串(utf8_general_ci),乱码 set names utf8;6、库表名字统一用小写(表大小写敏感,字段名大小写不敏感);7、索引名称默认为“idx_字段名”;8、库名用缩写,尽量在2~7个字母,注意避免用保留字段名;
总结:隔离线上线下、禁止未经dba确认的子查询上线、永远不再程序端显示加锁、统一字符集为utf8、统一命名规范

posted @ 2013-10-17 11:15  hechunhua  阅读(268)  评论(0编辑  收藏  举报