为什么需要强制索引?
数据库没有使用我们设想的索引进行SQL查询,导致查询特别慢。
select * from user where age = 26 force index(age); // 强制索引
select * from user where age = 26 use index(age); // 优先按照这种索引查找
/** * 检测某个表中是否存在某个索引 * @param $table * @param $index * @return bool * @author zhaohao * @date 2019-08-26 17:42 */if(!function_exists('hasIndex')) { function hasIndex($table, $name) { $conn = IlluminateSupportFacadesSchema::getConnection(); $dbSchemaManager = $conn->getDoctrineschemaManager(); $doctrinetable = $dbSchemaManager->ListtableDetails($table); return $doctrinetable->hasIndex($name); }}在laravel的代码里面需要这样写:
在这里用when方法来判断此索引是否存在,日过不存在的话就不用这个索引,不然会报错,避免有人误删索引后,导致系统报错。
此处强制索引的语句是:
->from(DB::raw('`erp_agents` FORCE INDEX (`test`)'))
例如:
$agents = Agent::where($whereType) ->when(hasIndex('Agent', 'test'),function ($q){ $q->from(DB::raw('`erp_agents` FORCE INDEX (`test`)')); }) ->when(request('position',false),function ($q){ $q->whereIn('position_ID',request('position')); }) ->whereIn('agents.status', $valIDStatus) ->where('worked_at', '<=', $end) ->where('is_suppose', 0) ->addDomination('m.statistics-human-vIEw') ->leftJoin('positions', 'positions.ID', '=', 'agents.position_ID') ->get(['worked_days', 'worked_at']);
【相关推荐:最新的五个Laravel视频教程】 总结
以上是内存溢出为你收集整理的laravel学习记录之强制指定索引进行查询全部内容,希望文章能够帮你解决laravel学习记录之强制指定索引进行查询所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)