我的SQL 语句是:
select distinct  item.item_id as itemId,(case when item_name like '%qq%' then 1 else 0) as matchNum,from item whern item_name like  '%qq%' order by matchNum limit 10
我想问下,如果在matchNum上建立临时索引。?
因为我想尽可能的提高查询效率

解决方案 »

  1.   

    ,(case when item_name like '%qq%' then 1 else 0) as matchNum
    这个貌似有点没必要..whern item_name like  '%qq%' 
    既然你的条件要查item_name存在qq字样的..那在SELECT的时候.ITEM_NAME就肯定有qq字样的.
      

  2.   

    要知道..是执行是先执行WHERE.再执行SELECT的..
    所以你在WHERE里的LIKE在用通配符打头..索引用不上.
      

  3.   

    对,是mysql ,我的目的是把匹配量高的排在前面
      

  4.   

    建议增加一列(matchNum),用来存放case when item_name like '%qq%' then 1 else 0,也就是只有0、1两种结果,在此列(matchNum)上建立索引update tt set matchNum=case when item_name like '%qq%' then 1 else 0 endselect distinct  item.item_id as itemId from item whern item_name like  '%qq%' order by matchNum limit 10
      

  5.   

    不能增加一列,因为我并不是在一个表中查询 ,而且我的case也并不是唯一的,这个是用户输入的关键字,不确定的
      

  6.   

    不能增加一列,因为我并不是在一个表中查询 ,用临时表总可以吧create table lsb as 
    select distinct  item.item_id as itemId,(case when item_name like '%qq%' then 1 else 0) 
    as matchNum from item whern item_name like  '%qq%'create index newtt on lsb(matchNum)select * from lsb order by matchNum limit 10 而且我的case也并不是唯一的,这个是用户输入的关键字,不确定的
    那么值是否固定,比如0、1
      

  7.   

    快速找出匹配一个WHERE子句的行。 
    当执行联结时,从其他表检索行。 
    对特定的索引列找出MAX()或MIN()值。 
    如果排序或分组在一个可用键的最左面前缀上进行(例如,ORDER BY key_part_1,key_part_2),排序或分组一个表。如果所有键值部分跟随DESC,键以倒序被读取。 
    在一些情况中,一个查询能被优化来检索值,不用咨询数据文件。如果对某些表的所有使用的列是数字型的并且构成某些键的最左面前缀,为了更快,值可以从索引树被检索出来。 
    假定你发出下列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语句: mysql> SELECT * FROM tbl_name WHERE col1=val1;
    mysql> SELECT * FROM tbl_name WHERE col2=val2;
    mysql> SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;如果一个索引存在于(col1、col2、col3)上,只有上面显示的第一个查询使用索引。第二个和第三个查询确实包含索引的列,但是(col2)和(col2、col3)不是(col1、col2、col3)的最左面前缀。 如果LIKE参数是一个不以一个通配符字符起始的一个常数字符串,MySQL也为LIKE比较使用索引。例如,下列SELECT语句使用索引: mysql> select * from tbl_name where key_col LIKE "Patrick%";
    mysql> select * from tbl_name where key_col LIKE "Pat%_ck%";在第一条语句中,只考虑有"Patrick" <= key_col < "Patricl"的行。在第二条语句中,只考虑有"Pat" <= key_col < "Pau"的行。 下列SELECT语句将不使用索引: mysql> select * from tbl_name where key_col LIKE "%Patrick%";
    mysql> select * from tbl_name where key_col LIKE other_col;在第一条语句中,LIKE值以一个通配符字符开始。在第二条语句中,LIKE值不是一个常数。 如果 column_name 是一个索引,使用column_name IS NULL的搜索将使用索引。 MySQL通常使用找出最少数量的行的索引。一个索引被用于你与下列操作符作比较的列:=、>、>=、<、<=、BETWEEN和一个有一个非通配符前缀象'something%'的LIKE的列。 任何不跨越的在WHERE子句的所有AND层次的索引不用来优化询问。 下列WHERE子句使用索引:... WHERE index_part1=1 AND index_part2=2
    ... WHERE index=1 OR A=10 AND index=2      /* index = 1 OR index = 2 */
    ... WHERE index_part1='hello' AND index_part_3=5
              /* optimized like "index_part1='hello'" */这些WHERE子句不使用索引: ... WHERE index_part2=1 AND index_part3=2  /* index_part_1 is not used */
    ... WHERE index=1 OR A=10                  /* No index */
    ... WHERE index_part1=1 OR index_part2=10  /* No index spans all rows */