问个数据表联合查询的问题,用的是Mysql数据库,我先把SQL语句列出来。
select c.name from plsm_8100.characters c inner join plsm_8100.account_data a where a.id=c.account_id and  c.name like '%$name%'
上面用到两表,别名分别是a和c。
这个SQL语句在查询数据量小的时候,也许没什么问题。但是当两表的数据量各为几十万甚至几百万条的时候,也许不行了吧。
我的问题是:我应该怎么弄,才能优化他的性能呢?
我想到的办法是:给a.id,c.account_id,c.name添加索引。
请问大家还有更好的办法吗?

解决方案 »

  1.   

    没有其它好办法,另外给,c.name添加索引没有意义,因为你的条件是  c.name like '%$name%',这种查询无法使用索引。你可以考虑一下全文索引。
      

  2.   

    select c.name from plsm_8100.characters c inner join plsm_8100.account_data a where a.id=c.account_id and c.name like '%$name%'两表连接查询,只需要在第二个表的关联字段上加索引。
    你在plsm_8100.account_data的ID字段加索引。c.name字段模糊查询,加了索引也不会用到。另外可以加个覆盖索引,a.id,c.account_id,c.name三个字段组成一个复合索引。
      

  3.   

    感谢楼上的朋友。
    另外可以加个覆盖索引,a.id,c.account_id,c.name三个字段组成一个复合索引。
    这种复合索引如何建立?因为我跟同事一起合作,给表起的别名可能不一样。
      

  4.   

    ALTER [IGNORE] TABLE tbl_name
        alter_specification [, alter_specification] ...alter_specification:
        ADD [COLUMN] column_definition [FIRST | AFTER col_name ]
      | ADD [COLUMN] (column_definition,...)
      | ADD INDEX [index_name] [index_type] (index_col_name,...)
    我说错了。
    c.account_id,c.name
    同一个表上的才行,复合索引。
      

  5.   

    当您的问题得到解答后请及时结贴.
    http://topic.csdn.net/u/20090501/15/7548d251-aec2-4975-a9bf-ca09a5551ba5.html
    http://topic.csdn.net/u/20100428/09/BC9E0908-F250-42A6-8765-B50A82FE186A.html
    http://topic.csdn.net/u/20100626/09/f35a4763-4b59-49c3-8061-d48fdbc29561.html8、如何给分和结贴?
    http://community.csdn.net/Help/HelpCenter.htm#结帖