取数据遇到的问题

在一张表中存储一百万道题目,题目分为数百个分类, 怎么随机取10道某个分类下的题目?

既要考虑速度, 又要保证取到10个随机的题目, 一条sql语句能完成吗? 当某个分类下的题目数量只有一百,怎么快速在百万数据中取出10道?

 

select t1.sid,ownername,sdesc,options,answer,fileurl from subject as t1 join( select round(rand()*(select max(sid) from subject)) as sid) as t2 where
t1.sid >= t2.sid and t1.ch2 = 18 limit 10;

此句速度快,首次执行0.35秒,后面0.001秒, 缺点是,若要查询的数据少,可能会不够10条,  不够10条就再请求一次数据。