联合索引使用情况:

mysql> EXPLAIN SELECT * FROM test.`friends` WHERE fuid=’364′ and fname=’test5′;
+—-+————-+———+——+—————+————+———+————-+——+————-+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+———+——+—————+————+———+————-+——+————-+
| 1 | SIMPLE | friends | ref | fuid_fname | fuid_fname | 112 | const,const | 2 | Using where
+—-+————-+———+——+—————+————+———+————-+——+————-+

  Sql优化器会对SELECT * FROM test.`friends` WHEREfname=’test5′ and fuid=’364′;进行优化,优化后的效果可能为:ELECT * FROM test.`friends` WHERE fuid=’364′ and fname=’test5′,这点目前还没证实;

mysql> EXPLAIN SELECT * FROM test.`friends` WHERE fname=’test5′ and fuid=’364′;
+—-+————-+———+——+—————+————+———+————-+——+————-+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+———+——+—————+————+———+————-+——+————-+
| 1 | SIMPLE | friends | ref | fuid_fname | fuid_fname | 112 | const,const | 2 | Using where
+—-+————-+———+——+—————+————+———+————-+——+————-+

  6、合适的字段数,组合索引的字段数不适宜较多,较多的组合索引字段数会降低索引查询效率,除业务特点需要建立多字段的组合主键例外。

  三、索引分析利器explain

  在做性能测试的过程中经常遇到一些数据库的问题,通常使用慢查询日志可以找到执行效果比较差的sql,但是仅仅找到这些sql是不行的,我们需要协助开发人员分析问题所在,这经常用到explain。

  explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。

  使用方法,在select语句前加上explain可以了:

mysql> explain select * from test.index_test where time1=’20130517100552′;
+—-+————-+————+——+—————+——-+———+——-+——+————-+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+————+——+—————+——-+———+——-+——+————-+
| 1 | SIMPLE | index_test | ref | time1 | time1 | 253 | const | 1 | Using where |
+—-+————-+————+——+—————+——-+———+——-+——+————-+

  EXPLAIN列的解释:

  id:SELECT识别符。这是SELECT的查询序列号,若没有子查询和联合查询,id则都是1,并且Mysql会按照id从大到小的顺序执行query,在id相同的情况下,则从上到下执行。

  table:显示这一行的数据是关于哪张表的。

  type:这是重要的列,显示连接使用了何种类型。

  Explain的type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:

  system>const>eq_ref> ref > range > index > ALL

  possible_keys:显示可能应用这张表中的那个索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句。

  key:实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引。

  key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好。

  ref:显示索引的哪一列被使用了,如果可能的话,是一个常数。

  rows:MYSQL认为必须检查的用来返回请求数据的行数。

  Extra:关于MYSQL如何解析查询的额外信息。

  Extra列返回的描述

  Distinct:一旦MYSQL找到了与行相联合匹配的行,不再搜索了

  Not exists:MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,不再搜索了

  Range checked for each Record(index map:#):没有找到理想的索引,因此对于从前面表中来的每一个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的慢的连接之一

  Using filesort:当看到这个的时候,查询有可能需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行

  Using index:列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候

  Using temporary 看到这个的时候,查询需要优化了。这里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上

  Using where:使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这会发生,或者是查询有问题不同连接类型的解释。