①请求了多余数据:


 -- 查出全部结果集:若数据库有1000行数据,但 仅需10行,决解办法 LIMIT 10


          


 -- 取出所有列:取数据时取出不必要列


          SELECT * FROM test;     X


          SELECT id,name FROM test;    对,假设仅需执行获取id和name



 -- 查询重复数据:如用户头像需多次取出,此时应将数据缓存起来



②重构查询方式:


-- 复杂查询切换为简单查询


-- 切分查询:



《高性能mysql》之查询性能优化(第六章)_mysql



注:将大量数据 删除分批次, 减小对服务器的 压力(如:删除过期账号的存储过程如何编写)



-- 分解关联查询:


          

《高性能mysql》之查询性能优化(第六章)_性能优化_02


          优势: 缓存效率更高,单个查询减少 锁的竞争,查询 效率提升,减少 冗余查询记录,易实现 哈希



③查询执行基础:


     

《高性能mysql》之查询性能优化(第六章)_性能优化_03



④查询优化器局限性:


-- 关联子查询:


           IN()用于子查询性能特别糟,要么分解,要么改EXISTS 如下:


           

《高性能mysql》之查询性能优化(第六章)_高性能_04



-- UNION的限制:合并多个结果集


-- 索引合并优化:多个独立索引自动合并成联合索引


 -- 等值传递:非常大的IN()列表会带来额外的消耗


-- 并行执行:mysql无法利用多核来并行执行查询


-- 哈希关联:自定义的哈希关联


-- 松散索引扫面:mysql5.6后版本支持


-- 最大值和最小值优化:


          

《高性能mysql》之查询性能优化(第六章)_nginx_05


          优化后:

《高性能mysql》之查询性能优化(第六章)_数据_06


      注:这个策略尽可能少的扫面数目


-- 在同一表上查询更新:mysql不允许在同一表上同时查询和更新


          


⑤查询优化器提示:


   -- HIGH_PRORITY、LOW_PRIORITY:调整sql语句优先级


   -- DELAYED:日志系统-用于大量写入且客户端不需要等待单条I/O完成


   -- STRAIGHT_JOIN:减少优化器的搜索时间


-- SQL_SMALL_RESULT、SQL_BIG_RESULT:告诉优化器对group by、distinct使用内存临时表/磁盘临时表


 -- SQL_BUFFER_RESULT:结果放在临时表并尽快释放,服务器需要更多内存


-- SQL_CACHE、SQL_NO_CACHE:结果是否存在查询缓存


-- FOR UPDATE、LOCK IN SHARE MODE:排它锁、共享锁


 -- USE INDEX、IGNORE INDEX、FORCE INDEX:使用或不使用哪些索引


注:对于新版本(5.5及以上)的mysql有相关优化策略,往往自己随意使用会导致相关优化策略 失效



⑥优化特定类型的查询:


-- 优化COUNT():


          简单优化: SELECT COUNT(*) FROM world where id>5;  改为--->


                          SELECT (SELECT COUNT(*) FROM world) - COUNT(*) FROM world where id<=5;


          查询多个总数: SELECT COUNT(color='red' OR NULL) as red, COUNT(color='blue' OR NULL) as blue


                                        FROM world;


     -- 优化关联查询:


          无特殊要求,仅在关联查询的第二个表中间索引


          关联查询中在GROUP BY、ORDER BY最好仅涉及一个表的列


          


     -- 优化子查询:子查询尽可能用关联查询替代


     -- 优化GROUP BY、DISTINCT:


          使用关联查询时仅使用表标识分组效率更高


      ·         

《高性能mysql》之查询性能优化(第六章)_性能优化_07


-- 优化LIMIT分页:偏移量大时,limit分页会进行全表扫描


          针对limit,延迟关联:


          

《高性能mysql》之查询性能优化(第六章)_nginx_08


          将limit改为between:


          记录上次查询标识,然后加入where