為什麼需要強制索引?
資料庫沒有使用我們設想的索引進行sql查詢,導致查詢特別慢。
mysql強制索引查詢語句
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']);
本作品採用《CC 協議》,轉載必須註明作者和本文連結