文章目录
- 数据库没有使用我们设想的索引进行sql查询,导致查询特别慢。
- select * from user where age = 26 force index(age); // 强制索引 select * from user where age = 26 use index(age); // 优先按照这种索引查找/** * 检测某个表中是否存在某个索引 * @param table * @paramindex * @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']);
数据库没有使用我们设想的索引进行sql查询,导致查询特别慢。
- select * from user where age = 26 force index(age); // 强制索引
select * from user where age = 26 use index(age); // 优先按照这种索引查找
/**
* 检测某个表中是否存在某个索引
* @param table
* @paramindex
* @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的代码里面需要这样写:
select * from user where age = 26 use index(age); // 优先按照这种索引查找
/**
* 检测某个表中是否存在某个索引
* @param table
* @paramindex
* @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);
}
}
在这里用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']);









