标签:一起 覆盖 ace 数值 mysql 数据库 strong force 内存缓存 key
详细内容看上文,提几点需要记住的要点。
1.注释
每个表要添加注释,对 status 型需指明主要值的含义,如”0-离线,1-在线”
2.表的字段数量
3.表的数据量控制在5000w以内
表字段数量不要超过20个,如果有需要建立主副表,主键一一关联,避免单行数据过多以及修改记录binlog ROW模式导致文件过大。
特别对于有一个text/blob或很大长度的varchar字段时,更应考虑单独存储。但也要注意查询条件尽量放在一个表上。
1.数字类型定义
2.timestamp 初始值
3. varchar 类型
4.字段都使用 NOT NULL
1.任何新的select,update,delete上线,都要先explain,看索引使用情况
尽量避免extra列出现:Using File Sort,Using Temporary,rows超过1000的要谨慎上线。
explain解读
type
:ALL, index, range, ref, eq_ref, const, system, NULL(从左到右,性能从差到好)possible_keys
:指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用key
:表示MySQL实际决定使用的键(索引)如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX
ref
:表示选择 key
列上的索引,哪些列或常量被用于查找索引列上的值rows
:根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数Extra
Using temporary
:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询Using filesort
:MySQL中无法利用索引完成的排序操作称为“文件排序”
2.避免冗余索引
InnoDB表是一棵索引组织表,主键是和数据放在一起的聚集索引,普通索引最终指向的是主键地址。不要在频繁更新的列上创建索引。
3.前缀索引
对超过30个字符长度的列创建索引时,考虑使用,如 idx_cs_guid2 (f_cs_guid(26))表示截取前26个字符做索引,既可以提高查找效率,也可以节省空间
4.联合索引
mysql使用联合索引时,从左向右匹配,遇到断开或者范围查询时,无法用到后续的索引列
比如索引idx_c1_c2_c3 (c1,c2,c3),相当于创建了(c1)、(c1,c2)、(c1,c2,c3)三个索引,where条件包含上面三种情况的字段比较则可以用到索引,但像 where c1=a and c3=c 只能用到c1列的索引,像 c2=b and c3=c等情况就完全用不到这个索引。遇到范围查询(>、<、between、like)也会停止索引匹配,比如 c1=a and c2 > 2 and c3=c,只有c1,c2列上的比较能用到索引
5.覆盖索引
INNODB存储引擎中,secondary index(非主键索引,又称为辅助索引、二级索引)没有直接存储行地址,而是存储主键值。
例如SELECT email,uid FROM user_email WHERE uid=xx,如果uid不是主键,适当时候可以将索引添加为index(uid,email),以获得性能提升。如果用户需要查询secondary index中所不包含的数据列,则需要先通过secondary index查找到主键值,然后再通过主键查询到其他数据列,因此需要查询两次。
1.能确定返回结果只有一条时,使用 limit 1
在保证数据不会有误的前提下,能确定结果集数量时,多使用limit,尽快的返回结果。
2.使用like模糊匹配,%不要放首位
会导致索引失效,有这种搜索需求是,考虑其它方案,如sphinx全文搜索
3.使用join时,where条件尽量使用充分利用同一表上的索引
4.考虑使用union all,少使用union,注意考虑去重
union all不去重,而少了排序操作,速度相对比union要快,如果没有去重的需求,优先使用union all
5.分页优化
大页情况下不使用跳跃式分页
假如有类似下面分页语句:
SELECT FROM table1 ORDER BY ftime DESC LIMIT 10000,10; 这种分页方式会导致大量的io,因为MySQL使用的是提前读取策略。
推荐分页方式:
SELECT FROM table1 WHERE ftime < last_time ORDER BY ftime DESC LIMIT 10 使用条件关系确定分页页数
6. count 计数
7.减少与数据库交互的次数,尽量采用批量SQL语句
INSERT ... ON DUPLICATE KEY UPDATE ...
,插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE,如果不重复则直接插入,影响1行。REPLACE INTO
类似,但它是冲突时删除旧行。INSERT IGNORE
相反,保留旧行,丢弃要插入的新行。
8.杜绝危险SQL
9.是否应该 order by 主键
许多排序的场景,如果主键id是增长的,如果 order by f_create_time 查询慢,有可能使用了filesort,此时最简单的办法是看能否换成 order by id,因为id作为主键是递增的,并且附带在了每个二级索引后面。
但是也要谨慎使用 order by id,特别是在explain结果看到filesort的情况下,优化器极有可能放弃这个filesort,而选择了它所认为更高效的扫描方式,实则更慢。
end
标签:一起 覆盖 ace 数值 mysql 数据库 strong force 内存缓存 key
原文地址:https://www.cnblogs.com/lemos/p/9385103.html