我有一张包含相对大数据的表,
因此下面的陈述需要很长时间:
SELECT MIN(column) FROM table WHERE ...
SELECT MAX(column) FROM table WHERE ...
我尝试对列进行索引,但性能仍然不足以满足我的需求。
我还想过使用触发器或事件在另一个表中缓存最小值和最大值 但我的MySQL版本是5.0.51a,它需要SUPER权限才能触发,并且不支持事件。
拥有SUPER权限或升级MySQL对我来说是不可能的 (如果可能的话,不需要问!)
如何在MySQL内部解决这个问题? 也就是说,没有OS的帮助。
答案 0 :(得分:0)
如果您的column
已编入索引,则应立即找到min(column)
,因为这是MySQL找到的第一个值。
索引列上的max(column)
也是如此。
如果由于某种原因无法添加索引,则以下触发器会将MIN和MAX值缓存在单独的表中。
请注意,TRUE = 1且FALSE = 0.
DELIMITER $$
CREATE TRIGGER ai_table1_each AFTER INSERT ON table1 FOR EACH ROW
BEGIN
UPDATE db_info i
SET i.minimum = LEAST(i.minimum, NEW.col)
,i.maximum = GREATEST(i.maximum, NEW.col)
,i.min_count = (i.min_count * (new.col < i.minumum))
+ (i.minimum = new.col) + (i.minimum < new.col)
,i.max_count = (i.max_count * (new.col > i.maximum))
+ (i.maximum = new.col) + (new.col > i.maximum)
WHERE i.tablename = 'table1';
END $$
CREATE TRIGGER ad_table1_each AFTER DELETE ON table1 FOR EACH ROW
BEGIN
DECLARE new_min_count INTEGER;
DECLARE new_max_count INTEGER;
UPDATE db_info i
SET i.min_count = i.min_count - (i.minimum = old.col)
,i.max_count = i.max_count - (i.maximum = old.col)
WHERE i.tablename = 'table1';
SELECT i.min_count INTO new_min_count, i.max_count INTO new_max_count
FROM db_info i
WHERE i.tablename = 'table1';
IF new_max_count = 0 THEN
UPDATE db_info i
CROSS JOIN (SELECT MAX(col) as new_max FROM table1) m
SET i.max_count = 1
,i.maximum = m.new_max;
END IF;
IF new_min_count = 0 THEN
UPDATE db_info i
CROSS JOIN (SELECT MIN(col) as new_min FROM table1) m
SET i.min_count = 1
,i.minimum = m.new_min;
END IF;
END $$
DELIMITER ;
after update
触发器将是插入和删除触发器的混合。