现在有A表,主键为id(innodb) 由于权限的管理,建立A表的视图 当利用其它表与A表做关联的时候,使用查询语句为B.id = A.id
 当直接使用A表的时候,可以使用主键Index  当使用A表的视图的时候,就只能扫描整个视图,因为mysql无法在视图上建立索引。查询速度很慢 请问如何解决这种问题,有什么好的办法

解决方案 »

  1.   

    视图代码 就是取表中的一部分数据实际需求是权限根据地域来,有个地域表C视图的语句如下:select * from A , C where A.id = C.id and C.folderId = 1;
      

  2.   

     如果是做权限 因为这里的地域是跟用户关联的 ,所以只要用户登录了,就需要在session中一直存在这个临时表,但是临时表是跟数据库连接存在的,如果使用的是数据库连接池,临时表是否不可用
      

  3.   

    而且很简单,如果有两个用户同时登录, 用户X对A表的操作, 用户Y必须能看到。所以临时表解决不了问题
      

  4.   

    可以测试一下,
    MYSQL HELP
    You can use the TEMPORARY keyword when creating a table. A TEMPORARY table is visible only to the current connection, and is dropped automatically when the connection is closed. This means that two different connections can use the same temporary table name without conflicting with each other or with an existing non-TEMPORARY table of the same name. (The existing table is hidden until the temporary table is dropped.) To create temporary tables, you must have the CREATE TEMPORARY TABLES privilege. 当前连接可用
      

  5.   

    包含了id  但是视图不会使用index
      

  6.   

    select * from A , C where A.id = C.id and C.folderId = 1;这个视图语句走索引吗
      

  7.   

      建立视图的过程没问题 很快 比如说A表有10000的数据,有了主键索引
      
     有视图V包括其中的5000的数据,V与A的结构完全一样 在执行一个与业务表B的关联查询时,条件为B.id = A.id
     如果使用A表,就会利用索引,每次扫描A表的行数只有1 如果使用V,就不会利用索引,每次扫描V的行数就是5000
      

  8.   

      从执行计划就可以看出视图不会走索引  而且这本身就是mysql的特性
      

  9.   

    视图当索引合适的时候会走索引。 关键要看语句是什么。
    贴出你的VIEW的代码和查询代码,及EXPLAIN SELECT及SHOE INDEX以供分析。