这时可以看到结果集还是条但是Extra中的filesort不见了这时mysql使用userid_clicks这个索引去查询这不但能快速查询到userid=admin的所有记录并且结果是根据clicks排好序的!所以不用再把这个结果集读入内存一条一条排序了效率上会高很多但是用多字段索引这种方式有个问题如果查询的sql种类很多的话就得好好规划一下了否则索引会建得非常多不但会影响到数据insert和update的效率而且数据表也容易损坏以上是对索引优化的办法因为原因可能会比较复杂所以写得比较的长一般好好优化了索引之后mysql的效率会提升n个档次从而也不需要考虑增加机器来解决问题了但是mysql甚至所有数据库可能都不好解决limit的问题在mysql中limit 只要索引合适是没有问题的但是limit 就会很慢了因为mysql会扫描排好序的结果然后找到这个点取出条返回要找到这个点就要扫描条记录这个循环是比较耗时的不知道会不会有什么好的算法可以优化这个扫描引擎我冥思苦想也想不出有什么好办法对于limit目前直至比较久远的将来我想只能通过业务程序和数据表的规划来优化我想到的这些优化办法也都还没有一个是万全之策往后再讨论
sql写法过于复杂
sql写法假如用到一些特殊的功能比如groupby或者多表联合查询的话mysql用到什么方式来查询也可以用desc来分析我这边用复杂sql的情况还不算多所以不常分析暂时就没有好的建议
配置错误
配置里主要参数是key_buffersort_buffer_size/myisam_sort_buffer_size这两个参数意思是key_buffer=M全部表的索引都会尽可能放在这块内存区域内索引比较大的话就开稍大点都可以我一般设为M有个好的建议是把很少用到并且比较大的表想办法移到别的地方去这样可以显着减少mysql的内存占用sort_buffer_size=M单个线程使用的用于排序的内存查询结果集都会放进这内存里如果比较小mysql会多放几次所以稍微开大一点就可以了重要是优化好索引和查询语句让他们不要生成太大的结果集
另外一些配置
thread_concurrency=这个配置标配=cpu数量x
interactive_timeout=
wait_timeout=这两个配置使用秒就可以了这样会尽快地释放内存资源注意一直在使用的连接是不会断掉的这个配置只是断掉了长时间不动的连接
query_cache这个功能不要使用现在很多人看到cache这几个字母就像看到了宝贝这是不唯物主义的mysql的query_cache在每次表数据有变化的时候都会重新清理连至该表的所有缓存如果更新比较频繁query_cache不但帮不上忙而且还会对效率影响很大这个参数只适合只读型的数据库如果非要用也只能用query_cache_type=自行用SQL_CACHE指定一些sql进行缓存
max_connections默认为一般情况下是足够用的但是一般要开大一点开到就可以了能超过的话一般就有效率问题得另找对策光靠增加这个数字不是办法
其它配置可以按默认就可以了个人觉得问题还不是那么的大提醒一下配置虽然很重要但是在绝大部分情况下都不是效率问题的罪魁祸首mysql是一个数据库对于数据库最重要考究的不应是效率而是稳定性和数据准确性
[] [] [] [] [] []