MySQL优化之对RAND()的优化方法
众所周知,在MySQL中,如果直接ORDERBYRAND()的话,效率非常差,因为会多次执行。事实上,如果等值查询也是用RAND()的话也如此,我们先来看看下面这几个SQL的不同执行计划和执行耗时。
首先,看下建表DDL,这是一个没有显式自增主键的InnoDB表:
[yejr@imysql]>showcreatetablet_innodb_random\G ***************************1.row*************************** Table:t_innodb_random CreateTable:CREATETABLE`t_innodb_random`( `id`int(10)unsignedNOTNULL, `user`varchar(64)NOTNULLDEFAULT'', KEY`idx_id`(`id`) )ENGINE=InnoDBDEFAULTCHARSET=latin1
往这个表里灌入一些测试数据,至少10万以上,id字段也是乱序的。
[yejr@imysql]>selectcount(*)fromt_innodb_random\G ***************************1.row*************************** count(*):393216
1、常量等值检索:
[yejr@imysql]>explainselectidfromt_innodb_randomwhereid=13412\G ***************************1.row*************************** id:1 select_type:SIMPLE table:t_innodb_random type:ref possible_keys:idx_id key:idx_id key_len:4 ref:const rows:1 Extra:Usingindex
[yejr@imysql]>selectidfromt_innodb_randomwhereid=13412; 1rowinset(0.00sec)