laravel學(xué)習(xí)記錄之強制指定索引進行查詢

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

為什么需要強制索引?

數(shù)據(jù)庫沒有使用我們設(shè)想的索引進行sql查詢,導(dǎo)致查詢特別慢。

mysql強制索引查詢語句

  • select * from user where age = 26 force index(age); // 強制索引

  • select * from user where age = 26 use index(age); // 優(yōu)先按照這種索引查找

/** ?*?檢測某個表中是否存在某個索引 ?*?@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方法來判斷此索引是否存在,日過不存在的話就不用這個索引,不然會報錯,避免有人誤刪索引后,導(dǎo)致系統(tǒng)報錯。

此處強制索引的語句是:

->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',?'where('is_suppose',?0) ????????????->addDomination('m.statistics-human-view') ????????????->leftJoin('positions',?'positions.id',?'=',?'agents.position_id') ????????????->get(['worked_days',?'worked_at']);

【相關(guān)推薦:最新的五個Laravel視頻教程

以上就是

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊14 分享