当你重建汇总和缓存表的时候,在操作的时候你常常需要它们的数据保持可见。你可以使用“shadow table”(影像表)来实现。当你已经创建它之后,你可以使用原子性的重命名来交换这些表。举个例子,如果
你需要重建my_summary,你能创建my_summary_new,填充数据,把它和真正的表作交换。
mysql> DROP TABLE IF EXISTS my_summary_new, my_summary_old;
mysql> CREATE TABLE my_summary_new LIKE my_summary;
-- populate my_summary_new as desired mysql> RENAME TABLE my_summary TO my_summary_old, my_summary_new TO my_summary;
SHOW TABLE STATUS FROM `servant_591up`WHERE ENGINE IS NOT NULL
AND NAME LIKE '%ol_ans%';
max min的优化
select min(id) from ol_user where username = 'dddd@dd.com'
(一)max 和 min 会扫描整张表。
mysql的主键都是按照升序排列的。
可以使用limit 改写查询,
select userid from ol_user where username='test@nd.com' limit 1
(二)对同一表进行select 和 update
mysql不允许对一个表进行update的时候进行select
update tb1 as out_table
set cnt = (select count(*) from tb1 as inner_table where inner_table.type = outer_table.type);
一个实现方式:衍生表,当成临时表来处理。
update tb1 inner join(
select type,count(*) as cnt
from tb1
group by type
)as der using(type)
set tb1.cnt = der.cnt;
图,并且得到好的性能。
2.MYISAM
只有在没有WHERE条件的时候COUNT(*)才是最快的,在有条件过滤的时候并不非常快。
3.简单优化
可以利用MYISAM对COUNT(*)的优化对已经有索引的一小部分做统计。
SELECT COUNT(*) FROM WORD.CITY WHERE ID>5;
优化为下面的语句
SELECT (SELECT COUNT(*) FROM CITY) - COUNT(*) FROM CITY WHEREID