一个table 中四个float型的字段,fa,fb,fc,fd好了常用到的查询条件是(fa+fb)<2.111 AND (fa+fb)>1.111 AND (fc+fd)<4.111 AND (fc+fd)>1.111嗯,数字我乱写的,这样的状况怎么建索引比较好?另外,该表数据量不大的,撑死了2万条

解决方案 »

  1.   

    建立联合索引:fa和fb建立一个联合索引;fc和fd建立一个联合索引。
      

  2.   

    fa和fb建立一个联合索引;fc和fd建立一个联合索引。
    select * from 
    (select * from tt where fa+fb ....)
    where fc+fd ....
      

  3.   

     多列索引可以视为包含通过连接索引列的值而创建的值的排序的数组。MySQL按这样的方式使用多列索引:当你在WHERE子句中为索引的第1个列指定已知的数量时,查询很快,即使你没有指定其它列的值。假定表具有下面的结构:CREATE TABLE test (    id INT NOT NULL,    last_name CHAR(30) NOT NULL,    first_name CHAR(30) NOT NULL,    PRIMARY KEY (id),    INDEX name (last_name,first_name));name索引是一个对last_name和first_name的索引。索引可以用于为last_name,或者为last_name和first_name在已知范围内指定值的查询。因此,name索引用于下面的查询:SELECT * FROM test WHERE last_name='Widenius'; SELECT * FROM test    WHERE last_name='Widenius' AND first_name='Michael'; SELECT * FROM test    WHERE last_name='Widenius'    AND (first_name='Michael' OR first_name='Monty'); SELECT * FROM test    WHERE last_name='Widenius'    AND first_name >='M' AND first_name < 'N';然而,name索引不用于下面的查询:SELECT * FROM test WHERE first_name='Michael'; SELECT * FROM test    WHERE last_name='Widenius' OR first_name='Michael';
      

  4.   

     假定你执行下面的SELECT语句:mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;如果col1和col2上存在一个多列索引,可以直接取出相应行。如果col1和col2上存在单列索引,优化器试图通过决定哪个索引将找到更少的行来找出更具限制性的索引并且使用该索引取行。如果表有一个多列索引,优化器可以使用最左面的索引前缀来找出行。例如,如果有一个3列索引(col1,col2,col3),则已经对(col1)、(col1,col2)和(col1,col2,col3)上的搜索进行了索引。如果列不构成索引最左面的前缀,MySQL不能使用局部索引。假定有下面显示的SELECT语句。 SELECT * FROM tbl_name WHERE col1=val1;SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2; SELECT * FROM tbl_name WHERE col2=val2;SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3; 如果 (col1,col2,col3)有一个索引,只有前2个查询使用索引。第3个和第4个查询确实包括索引的列,但(col2)和(col2,col3)不是 (col1,col2,col3)的最左边的前缀。