关于如何让视图使用索引的查询问题

benluobo 2013-07-10 09:25:08
现在有A表,主键为id(innodb)

由于权限的管理,建立A表的视图

当利用其它表与A表做关联的时候,使用查询语句为B.id = A.id


当直接使用A表的时候,可以使用主键Index

当使用A表的视图的时候,就只能扫描整个视图,因为mysql无法在视图上建立索引。查询速度很慢

请问如何解决这种问题,有什么好的办法
...全文
477 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
benluobo 2013-07-10
  • 打赏
  • 举报
回复
从执行计划就可以看出视图不会走索引 而且这本身就是mysql的特性
benluobo 2013-07-10
  • 打赏
  • 举报
回复
建立视图的过程没问题 很快 比如说A表有10000的数据,有了主键索引 有视图V包括其中的5000的数据,V与A的结构完全一样 在执行一个与业务表B的关联查询时,条件为B.id = A.id 如果使用A表,就会利用索引,每次扫描A表的行数只有1 如果使用V,就不会利用索引,每次扫描V的行数就是5000
rucypli 2013-07-10
  • 打赏
  • 举报
回复
select * from A , C where A.id = C.id and C.folderId = 1; 这个视图语句走索引吗
rucypli 2013-07-10
  • 打赏
  • 举报
回复
引用 11 楼 benluobobo 的回复:
包含了id 但是视图不会使用index
从哪看的视图不会使用索引
benluobo 2013-07-10
  • 打赏
  • 举报
回复
包含了id 但是视图不会使用index
rucypli 2013-07-10
  • 打赏
  • 举报
回复
视图没有包含id?
benluobo 2013-07-10
  • 打赏
  • 举报
回复
我在想用类似物化视图的概念解决 就是对每个权限都新建一个表 这就需要在维护A表的时候对这些所有的权限表同时维护
WWWWA 2013-07-10
  • 打赏
  • 举报
回复
引用 6 楼 benluobobo 的回复:
而且很简单,如果有两个用户同时登录, 用户X对A表的操作, 用户Y必须能看到。 所以临时表解决不了问题
那就没有办法了,只有放弃速度
WWWWA 2013-07-10
  • 打赏
  • 举报
回复
引用 5 楼 benluobobo 的回复:
如果是做权限 因为这里的地域是跟用户关联的 ,所以只要用户登录了,就需要在session中一直存在这个临时表,但是临时表是跟数据库连接存在的,如果使用的是数据库连接池,临时表是否不可用
可以测试一下, 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. 当前连接可用
benluobo 2013-07-10
  • 打赏
  • 举报
回复
而且很简单,如果有两个用户同时登录, 用户X对A表的操作, 用户Y必须能看到。 所以临时表解决不了问题
benluobo 2013-07-10
  • 打赏
  • 举报
回复
如果是做权限 因为这里的地域是跟用户关联的 ,所以只要用户登录了,就需要在session中一直存在这个临时表,但是临时表是跟数据库连接存在的,如果使用的是数据库连接池,临时表是否不可用
benluobo 2013-07-10
  • 打赏
  • 举报
回复
现在有种解决办法就是利用物化视图的概念,直接用表去替换,但是就需要在A表上建立触发器,同时更新所有相关物化视图中的表
WWWWA 2013-07-10
  • 打赏
  • 举报
回复
最简单的方法就是建立与A表相同的临时表(索引也相同),对临时表操作即可
benluobo 2013-07-10
  • 打赏
  • 举报
回复
视图代码 就是取表中的一部分数据 实际需求是权限根据地域来,有个地域表C 视图的语句如下: select * from A , C where A.id = C.id and C.folderId = 1;
WWWWA 2013-07-10
  • 打赏
  • 举报
回复
视图代码是什么?
ACMAIN_CHM 2013-07-10
  • 打赏
  • 举报
回复
视图当索引合适的时候会走索引。 关键要看语句是什么。 贴出你的VIEW的代码和查询代码,及EXPLAIN SELECT及SHOE INDEX以供分析。

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧