Mysql函数调用优化
MySQL函数在内部被标记为确定性或非确定性。非确定性函数如:RAND()、UUID()等,如果给它的参数固定值,它可以对不同的结果返回不同的结果被调用。确定函数如POW(),log()等,如果给它的参数固定值,会返回同一个结果被调用。不确定性函数可能会影响查询性能。
CREATE TABLE t1 (id INT NOT NULL AUTO_INCREMENT, co_name VARCHAR(100), PRIMARY KEY(id));
INSERT INTO t1(co_name) VALUES('A');
INSERT INTO t1(co_name) VALUES('B');
INSERT INTO t1(co_name) VALUES('C');
INSERT INTO t1(co_name) VALUES('E');
INSERT INTO t1(co_name) VALUES('F');
INSERT INTO t1(co_name) VALUES('G');
EXPLAIN
SELECT * FROM t1 WHERE id = POW(1,2);
第一个查询总是产生一行的最大值,因为带有常量参数的POW()是一个常数值,用于索引查找。
EXPLAIN
SELECT * FROM t1 WHERE id = FLOOR(1 + RAND()*10);
update t1 SET co_name= 'AB' WHERE id = FLOOR(1 + RAND() * 49);
但是,它可能更新零行、一行或多行,具体取决于id列值和RAND()序列中的值。
优化器可以作为一个常值:
SET @id= FLOOR(1 + RAND() *10);
update t1 set co_name = 'AB' WHERE id = @id;
SET co_name = 'AB'
WHERE id = c.a;