多列索引和索引顺序: 出现多个索引做相交操作时(多个AND条件),通常来说一个包含所有相关列的索引要优于多个独立索引。 在选择性高的字段上建立索引,可以让MySQL在查询时过滤掉更多的行。对于多列索引,哪个索引字段在前面,取决于索引的选择性的高低。选择性高的索引排在前面,有利于提高查询效率。例如联合索引(user_group_id,trade_amount)用户的群组肯定比订单的交易金额的选择性高。 覆盖索引:如果一个索引包含或者说覆盖所有需要查询的字段的值,那么就没有必要再回表查询,这就称为覆盖索引。覆盖索引是非常有用的工具,可以极大的提高性能,因为查询只需要扫描索引会带来许多好处: 优化关联查询:以小表驱动大表。 子查询尽量换成join。这是因为join,MySQL不需要在内存中创建临时表来完成这个逻辑上的需求。 确保任何的GROUP BY和ORDER BY中的表达式只涉及到一个表中的列,这样MySQL才有可能使用索引来优化。 优化LIMIT分页:一个常见的问题是当偏移量非常大的时候,比如:LIMIT 10000 20这样的查询,MySQL需要查询10020条记录然后只返回20条记录,前面的10000条都将被抛弃,这样的代价非常高。优化这种查询一个最简单的办法就是尽可能的使用覆盖索引扫描,而不是查询所有的列。然后根据需要做一次关联查询再返回所有的列。对于偏移量很大时,这样做的效率会提升非常大。考虑下面的查询: 修改前:SELECT film_id,description FROM film ORDER BY title LIMIT 50,5; 修改后: SELECT film.film_id,film.description FROM film INNER JOIN ( SELECT film_id FROM film ORDER BY title LIMIT 50,5 ) AS tmp USING(film_id); 优化UNION:除非确实需要服务器去重,否则就一定要使用UNION ALL,如果没有ALL关键字,MySQL会给临时表加上DISTINCT选项,这会导致整个临时表的数据做唯一性检查,这样做的代价非常高。 避免导致索引失效的写法 (1)负向条件查询不能使用索引(not in/not exists都不是好习惯) (2)前导模糊查询不能使用索引(like'XX%') (3)数据区分度不大的字段不宜使用索引 (4)在属性上进行计算不能命中索引 (5)复合索引最左前缀不满足 强制类型转换会全表扫描 如果明确知道只有一条结果返回,limit 1能够提高效率 2)合理设置mysql的部分参数,达到最高效。
thread_pool_size:如果主引擎(primary storage engine)为InnoDB,thread_pool_size最佳设置可能在16和36之间,最常见的优化值倾向于24到36。 thread_pool_stall_limit:用处理被阻塞和长时间运行的语句,确保服务器不完全被阻塞。设置过长会导致线程被阻塞,引起性能问题。 tmp_table_size:通过设置tmp_table_size选项来增加一张临时表的大小,例如做order by ,GROUP BY操作生成的临时表。如果调高该值,MySQL同时将增加heap表的大小,可达到提高联接查询速度的效果,建议尽量优化查询,要确保查询过程中生成的临时表在内存中,避免临时表过大导致生成基于硬盘的MyISAM表。