如果视图里只查一张表,则没问题。union另一张表之后,索引就不作用了。
是不是使用了union后,查询变成:先把两张表union,然后在结果中一条条找啊?

解决方案 »

  1.   

    我现在发现把视图里的字段做个联合索引后好像用到了索引了,但感觉还是慢啦(当然,这个测试数据很少是不会慢的)。EXPLAIN表示最外层查询类型是all,莫非是说先把两张表union,然后在结果中一条条找啊
    /*创建测试表结构---start*/
    CREATE TABLE t1(
    id INT NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(30),
    city VARCHAR(30),
    PRIMARY KEY (id),
    INDEX(`name`),
    INDEX(city)
    );CREATE TABLE t2(
    id INT NOT NULL AUTO_INCREMENT,
    username VARCHAR(50),
    addr VARCHAR(30),
    PRIMARY KEY (id),
    INDEX(username),
    INDEX(addr)
    );
    /*创建测试表结构---end*//*插入测试数据--start*/
    INSERT INTO t1(`name`,city)
    SELECT '张三','北京' UNION ALL
    SELECT '李四','上海' UNION ALL
    SELECT '王五','广州' UNION ALL
    SELECT '赵六','深圳' UNION ALL
    SELECT '张七','天津' UNION ALL
    SELECT '张八','杭州';INSERT INTO t2(username,addr)
    SELECT 'admin','长沙' UNION ALL
    SELECT 'asdf','武汉' UNION ALL
    SELECT 'xfg','成都' UNION ALL
    SELECT 'dfg','南京' UNION ALL
    SELECT 'rty67','温州' UNION ALL
    SELECT 'erjj','黑龙江';
    /*插入测试数据--end*//*添加联合索引--start*/
    ALTER TABLE t1
    ADD INDEX index_to_view(`name`,city);
    ALTER TABLE t2
    ADD INDEX index_to_view(username,addr);
    /*添加联合索引--end*//*创建视图--start*/
    DROP VIEW test;
    CREATE VIEW test AS 
    (
    SELECT 
    't1' AS src,
    a.id AS id,
    a.name AS username,
    a.city AS city
    FROM 
    t1 a
    )
    UNION ALL 
    (
    SELECT 
    't2' AS src,
    b.id AS id,
    b.username,
    b.addr
    FROM 
    t2 b
    );
    /*创建视图--end*//*执行测试---start*/
    EXPLAIN SELECT * FROM test WHERE username='xx' AND id<100;
    /*执行测试---end*/
      

  2.   

    同样问题 求解
    到底用没用到索引
    我也是用的union all 例子大致和楼主一样!
      

  3.   

    同求。
    还有,我在mysql里,拿bit类型的数据和1 union,得到的结果怎么是BLOB?
    怎么才能得到union后也是bit类型的?