焦点
- 不在数据库做运算
- 单表数据量:一年内单表纯INT不高出1000W,含CHAR不超500W。单库不高出300~400表
- 表字段只管少,上限节制在20~50个
- 恰当可以冗余(均衡范式和冗余)
- 拒绝大sql,大事宜,大批量

字段
- 数值范例的字节和运用范畴
- 假如可以,将字符串转化为数字存储。可以加速查询速率和节减空间,举例用INT取代CHAR(15)来存储IP
- 优先行使SET和ENUM...(也许有题目!)
- 停止行使NULL
- 罕用TEXT/BLOB,假如必需行使(高出varchar最大限定64k)则必需拆分到单独的表
- 不在数据库存图片
索引
- 能不加的索引只管不加,最好不高出字段数的20%(如:性别不加),团结焦点SQL优先思量包围索引
- 字符字段必需建前缀索引。因为字符串很长,凡是可以索引开始的几个字符,而不是所有值,以节省空间并获得好的机能。
- 不在索引罗列办数学运算和函数运算(会导致无法行使索引 => 全表扫描),如where id+1 = 100 和 id = 100 - 1,服从差很远
- 自增列或全局ID做INNODB的主键
- 只管不消外键(由措施担保束缚),高并发的时辰轻易死锁
SQL
- SQL语句尽也许简朴,由于一条SQL只能在一个CPU运算,在高并发的环境下,也许一条大SQL就把整个数据库堵死。而简朴的SQL缓存掷中率更高,镌汰锁表的时刻(出格是MyISAM),用上多CPU
- 保持事宜、DB毗连足够短,即开即用、用完就关。与事宜无关操纵放到事宜表面,镌汰锁资源的占用;在不粉碎同等性条件下,行使多个短事宜取代长事宜(如:发帖时的图片上传守候)
- 尽也许罕用存储进程,罕用触发器,减用MySQL函数对功效举办处理赏罚(交由客户端措施认真)
- 只管罕用select *,只取必要数据列,为行使包围索引提供也许性,镌汰姑且表天生,更安详
- 用in()取代or,由于or的服从是O(n),而in()的服从是O(Log n)。如:where a = 1 OR a = 100 与 where a IN (1, 100)
- merge index每每很弱智,以是用union取代对多字段的or查询。如:select * from t where a = 1 OR b = 2 与 select * from t where a = 1 UNION select * from t where b = 2
- 只管停止负向查找,如NOT、!=等
- 只管停止%前缀恍惚查询,因为行使的是B+ Tree,前缀恍惚行使不了索引,导致全表扫描(后缀恍惚速率相对快许多)
- 镌汰COUNT(*),行使COUNT(col),前者资源开销大,只管罕用。MyISAM不带WHERE COUNT()而INNODB带WHERE COUNT()。 计数的统计可以回收的要领:及时统计可以行使memcache,双向更新,破晓跑基准;非及时统计只管用单独统计表,按期重算
- LIMIT高效分页:传统的要领是select * from t limit 10000, 10,保举的要领是select * from t where id > 23423 limit 10。LIMIT的偏移量越大则越慢。尚有一些高效的要领有:先取id来LIMIT偏移,镌汰整体的数据偏移;取到必要的id,与原表JOIN;措施取ID,然后用IN来填写。select * from t where id >= (select id from t limit 10000, 1) limit 10 , select * from t INNER JOIN (select id from t limit 10000, 10) USING (id) , select id from t limit 10000, 10; select * from t where id in (123, 456...)
- 若无需对功效举办去重,则用UNION ALL而非UNION(UNION有去重开销)
- 解析JOIN联接来担保高并发。高并发DB不提议举办两个表以上的JOIN
- group by会默认自动升序排序,假如必要去掉排序,必要指定order by NULL
- 较量原则:数字对数字、字符对字符。假如数值列与字符范例作较量,同时转换成双精度;假如字符列与数值范例作较量,字符列整列转数值,且不会行使索引查询
- load data导入数据比insert快约20倍(不必要革新缓存)
- 只管不行使insert...select(耽误、同步堕落)
- 大批量更新破晓操纵,避开岑岭
- SQL的一些呼吁:explain, show profile, mysqlsla, mysqldumpslow, show slow log, show processlist, show QUERY_RESPONSE_TIME(Percona)
约定
- 数据库在差异时期行使差异的:及时数据用real库,模仿情形用sim库,测试用qa库,开拓用dev库
- 榨取未经DBA确认的子查询(大部门环境优化较差,出格是WHERE中行使IN id的子查询,一样平常可以用JOIN改写)
- 不要在措施上加锁数据库,由于外部锁对数据库不行控,高并发时是劫难,而且极难调试排查(可以回收事宜来办理)
- 同一字符集:UTF-8,校对法则:utf8_general_ci
- 库和表的名称同一用小写(巨细写敏感、且差异操纵体系都有差异的限定);字段名巨细写不敏感;索引名默以为idx_字段名;库名用缩写,只管在2~7个字母;停止用保存字定名
【编辑保举】 - 官方器材|MySQL Router高可用道理与拭魅战
- 半小时MySQL基本入门,值得保藏
- MySQL的又一神器-锁,MySQL口试必备
- MySQL尝试之差异字符集数据库迁徙步调演示
- 看这些MySQL的重要常识点,吃透它
【责任编辑:未丽燕 TEL:(010)68476606】
点赞 0 (编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|