1.6 松散索引扫描
描述:所谓的松散索引就是当对表进行扫描是,可以智能的跳过一些记录,以此来减少需要扫描的记录行数.为了更清楚的说明这个问题,举个例子来说明松散索引扫描的好处,例如table1表上有索引(a,b),执行 select * from tabl1 where b between2 and 3时,支持/不支持松散扫描的表扫描方式分别如下
由于B列是按照顺序排列的,所以只需要在固定的区间内查找就可以了,其余的记录可以跳过
1.7 Max()/MIN()
问题描述:
当执行 select max(id) from table1 where name=’sun’ 时,如果name没有建立相应的索引,MYSQL会进行全表扫描
解决方案:
将SQL等同的转化为
select id from table1 use index(PRIMARY) wherename=’sun’ limit 1.这样的语句会尽可能少的扫描表记录
1.8 同一个表的查询以及更新
问题描述:
不能在查询某个表的同时对表进行更新
Update table1t1 set t1.cnt=(select count(*) fromtable1)
否则会抛出异常: ERROR 1093 (HY000): You can'tspecify target table 'ftsexchangerate' for update in FROM clause
解决办法: 转化成关联表的形式
update ftsexchangerate
inner join(
select currency,count(*) as cnt from ftsexchangerate group by (currency) ) as innusing(currency)
set ftsexchangerate.description=inn.cnt ;