少用一次select * ,少一次苦恼。
小编:这篇杂记,很水
1、避免使用select *查询
2、避免重复查询相同数据
3、mysql是否在扫描额外的记录,尽可能查询只返回需要的数据。最简单的衡量查询开销的3个指标:响应时间,扫描行数,返回的行数。检查慢日志记录是找出扫描行数过多的查询的办法 。
3.1 查看查询扫描的行数与返回行数
3.2 查看扫描行数和访问类型
explain语句中的type列反映了访问类型(全表扫描、索引扫描、范围扫描、唯一索引查询、常数引用等)。
mysql能够使用3钟方式应用where:1、在索引中使用where条件来过滤不匹配的记录(在存储引擎层完成);2、使用索引覆盖扫描(在extra列出现using index)来返回记录,直接从索引中过滤不需要的记录并返回命中的结果(在服务器层完成,无须再回表查询记录);3、从数据表中返回数据,然后过滤不满足条件记录(在extra中出现using where)(在服务器层完成,需要从数据表读取记录然后过滤)
4、若需查询需要扫描大量数据,但是只返回很少的行:
4.1 使用索引覆盖扫描,把所有需要用的列都放到索引中,这样存储引擎无须回表获取对应行就可以返回结果;
4.2 改变数据库结构(如:使用单独的汇总表);
4.3 重写复杂查询(使MYSQL优化器可以用更优化的方式执行此查询)。
5、考虑1个复杂查询还是多个简单查询
6、切分查询:将一个大的查询切分成多个小部分查询(避免一次锁住很多数据、占满事务日志、耗尽系统资源、阻塞其他重要查询,可减少mysql复制的延迟)
7、分解关联查询(优点:让缓存的效率更高;将查询分解后,执行单个查询可以减少锁竞争;在做应用层关联,可以更容易对数据库拆分,更容易做到高性能和可扩展;可减少冗余记录查询)
8、show processlist可以获得现在的查询状态
9、查询缓存:在解析一个查询语句前,如果查询缓存是打开的,那么MYSQL会优先检查这个查询是否命中查询缓存中的数据。
MYSQL通过关键字将SQL语句进行解析,并生成一颗相应的解析树,解析器将使用mysql语法规则验证和解析查询。
10、查询优化器:一个查询有多种执行方式,优化器将找到最好的执行计划。
11、尽可能避免排序或者避免对大量数据进行排序(可查询所需要的列,再根据给定列排序,然后返回结果)
12、索引合并和交叉过滤的方式来定位需要查找的行
13、优化关联查询:确保on或者using子句中的列上有索引;确保任何group by和order by中的表达式只涉及到一个表中的列
14、优化group by和distinct:使用索引优化
15、避免使用select for update
16、尽可能在索引中完成排序;只取出自己需要的列,避免多余的列;尽可能避免复杂的 Join语句和子查询;
17、可用exist代替的条件语句,避免使用in
18、可用分表查询的语句,避免使用join连接