mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-01-06 18:21:39 +09:00
#19685832 add index hint when document select query.
add low_priority when docuement insert, update, delete query. because select slow query table lock. git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8289 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
parent
0943470d5f
commit
048866cd25
10 changed files with 1663 additions and 1534 deletions
|
|
@ -411,7 +411,6 @@
|
|||
* @remarks if $type is not 'number', call addQuotes() and wrap with ' '
|
||||
**/
|
||||
function getConditionValue($name, $value, $operation, $type, $column_type) {
|
||||
|
||||
if(!in_array($operation,array('in','notin','between')) && $type == 'number') {
|
||||
if(is_array($value)){
|
||||
$value = join(',',$value);
|
||||
|
|
|
|||
|
|
@ -449,7 +449,11 @@
|
|||
$value_list[] = $value;
|
||||
}
|
||||
|
||||
$query = sprintf("insert into %s (%s) values (%s);", implode(',',$table_list), implode(',',$column_list), implode(',', $value_list));
|
||||
//priority setting
|
||||
$priority = '';
|
||||
if($output->priority) $priority = $output->priority['type'].'_priority';
|
||||
|
||||
$query = sprintf("insert %s into %s (%s) values (%s);", $priority, implode(',',$table_list), implode(',',$column_list), implode(',', $value_list));
|
||||
return $this->_query($query);
|
||||
}
|
||||
|
||||
|
|
@ -477,7 +481,11 @@
|
|||
// List the conditional clause
|
||||
$condition = $this->getCondition($output);
|
||||
|
||||
$query = sprintf("update %s set %s %s", implode(',',$table_list), implode(',',$column_list), $condition);
|
||||
//priority setting
|
||||
$priority = '';
|
||||
if($output->priority) $priority = $output->priority['type'].'_priority';
|
||||
|
||||
$query = sprintf("update %s %s set %s %s", $priority, implode(',',$table_list), implode(',',$column_list), $condition);
|
||||
|
||||
return $this->_query($query);
|
||||
}
|
||||
|
|
@ -493,7 +501,11 @@
|
|||
// List the conditional clause
|
||||
$condition = $this->getCondition($output);
|
||||
|
||||
$query = sprintf("delete from %s %s", implode(',',$table_list), $condition);
|
||||
//priority setting
|
||||
$priority = '';
|
||||
if($output->priority) $priority = $output->priority['type'].'_priority';
|
||||
|
||||
$query = sprintf("delete %s from %s %s", $priority, implode(',',$table_list), $condition);
|
||||
|
||||
return $this->_query($query);
|
||||
}
|
||||
|
|
@ -568,7 +580,11 @@
|
|||
$output->column_list = $column_list;
|
||||
$condition = $this->getCondition($output);
|
||||
|
||||
if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $left_join, $condition, $output);
|
||||
if(count($output->index_hint))
|
||||
$index_hint = sprintf(' %s index (%s) ', $output->index_hint['type'], $output->index_hint['name']);
|
||||
|
||||
if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $left_join, $index_hint, $condition, $output);
|
||||
|
||||
// Add a condition to use an index when sorting in order by list_order, update_order
|
||||
if($output->order) {
|
||||
$conditions = $this->getConditionList($output);
|
||||
|
|
@ -615,7 +631,7 @@
|
|||
$columns = join(',',$columns);
|
||||
}
|
||||
|
||||
$query = sprintf("select %s from %s %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition, $groupby_query.$orderby_query);
|
||||
$query = sprintf("select %s from %s %s %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $index_hint, $condition, $groupby_query.$orderby_query);
|
||||
|
||||
// Apply when using list_count
|
||||
if($output->list_count['value']) $query = sprintf('%s limit %d', $query, $output->list_count['value']);
|
||||
|
|
@ -644,7 +660,7 @@
|
|||
*
|
||||
* It is quite convenient although its structure is not good at all .. -_-;
|
||||
**/
|
||||
function _getNavigationData($table_list, $columns, $left_join, $condition, $output) {
|
||||
function _getNavigationData($table_list, $columns, $left_join, $index_hint, $condition, $output) {
|
||||
require_once(_XE_PATH_.'classes/page/PageHandler.class.php');
|
||||
|
||||
$column_list = $output->column_list;
|
||||
|
|
@ -715,7 +731,7 @@
|
|||
$columns = join(',',$columns);
|
||||
}
|
||||
|
||||
$query = sprintf("select %s from %s %s %s %s", $columns, implode(',',$table_list), implode(' ',$left_join), $condition, $groupby_query.$orderby_query);
|
||||
$query = sprintf("select %s from %s %s %s %s %s", $columns, implode(',',$table_list), implode(' ',$left_join), $index_hint, $condition, $groupby_query.$orderby_query);
|
||||
$query = sprintf('%s limit %d, %d', $query, $start_count, $list_count);
|
||||
$query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):'';
|
||||
|
||||
|
|
|
|||
|
|
@ -108,6 +108,19 @@
|
|||
$group_list = $xml_obj->query->groups->group;
|
||||
$out = $this->_setGroup($group_list);
|
||||
$output->groups = $out->groups;
|
||||
|
||||
//priority arrange
|
||||
$priority = $xml_obj->query->priority;
|
||||
if($priority) $output->priority['type'] = $priority->attrs->type;
|
||||
|
||||
//index hint arrange
|
||||
$index_hint = $xml_obj->query->index_hint;
|
||||
if($index_hint)
|
||||
{
|
||||
$output->index_hint['name'] = $index_hint->attrs->name;
|
||||
$output->index_hint['type'] = $index_hint->attrs->type;
|
||||
}
|
||||
|
||||
// Navigation
|
||||
$out = $this->_setNavigation($xml_obj);
|
||||
$output->order = $out->order;
|
||||
|
|
@ -116,6 +129,8 @@
|
|||
$output->page = $out->page;
|
||||
|
||||
$column_count = count($output->columns);
|
||||
$priority_count = count($output->priority);
|
||||
$index_hint_count = count($output->index_hint);
|
||||
$condition_count = count($output->conditions);
|
||||
|
||||
$buff .= '$output->tables = array( ';
|
||||
|
|
@ -145,6 +160,19 @@
|
|||
$buff .= $this->_getColumn($output->columns);
|
||||
$buff .= ' );'."\n";
|
||||
}
|
||||
|
||||
//priority arrange
|
||||
if($priority_count) {
|
||||
$priority_str .= '$output->priority = array("type"=>"%s");'."\n";
|
||||
$buff .= vsprintf($priority_str, $output->priority);
|
||||
}
|
||||
|
||||
// index arrange
|
||||
if($index_hint_count) {
|
||||
$index_hint_str .= '$output->index_hint = array("name"=>"%s", "type"=>"%s");'."\n";
|
||||
$buff .= vsprintf($index_hint_str, $output->index_hint);
|
||||
}
|
||||
|
||||
// get conditions
|
||||
if($condition_count) {
|
||||
$buff .= '$output->conditions = array ( ';
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -206,6 +206,19 @@
|
|||
if($use_division) {
|
||||
// Division begins
|
||||
$division = (int)Context::get('division');
|
||||
|
||||
// list_order로 정렬하면서 module_srl이 0이거나 매우 많아서 full scan하는 경우 인덱스를 타도록
|
||||
if($args->sort_index == 'list_order' && ($args->module_srl === 0 || count($args->module_srl) > 10))
|
||||
{
|
||||
$listSqlID = 'document.getDocumentListUseIndex';
|
||||
$divisionSqlID = 'document.getDocumentDivisionUseIndex';
|
||||
}
|
||||
else
|
||||
{
|
||||
$listSqlID = 'document.getDocumentList';
|
||||
$divisionSqlID = 'document.getDocumentDivision';
|
||||
}
|
||||
|
||||
// If you do not value the best division top
|
||||
if(!$division) {
|
||||
$division_args->module_srl = $args->module_srl;
|
||||
|
|
@ -213,7 +226,7 @@
|
|||
$division_args->list_count = 1;
|
||||
$division_args->sort_index = $args->sort_index;
|
||||
$division_args->order_type = $args->order_type;
|
||||
$output = executeQuery("document.getDocumentList", $division_args);
|
||||
$output = executeQuery($listSqlID, $division_args);
|
||||
if($output->data) {
|
||||
$item = array_pop($output->data);
|
||||
$division = $item->list_order;
|
||||
|
|
@ -231,7 +244,7 @@
|
|||
$last_division_args->order_type = $args->order_type;
|
||||
$last_division_args->list_order = $division;
|
||||
$last_division_args->page = 5001;
|
||||
$output = executeQuery("document.getDocumentDivision", $last_division_args);
|
||||
$output = executeQuery($divisionSqlID, $last_division_args);
|
||||
if($output->data) {
|
||||
$item = array_pop($output->data);
|
||||
$last_division = $item->list_order;
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
<tables>
|
||||
<table name="documents" />
|
||||
</tables>
|
||||
<priority type="low" />
|
||||
<conditions>
|
||||
<condition operation="equal" column="document_srl" var="document_srl" filter="number" notnull="notnull" />
|
||||
</conditions>
|
||||
|
|
|
|||
20
modules/document/queries/getDocumentDivisionUseIndex.xml
Normal file
20
modules/document/queries/getDocumentDivisionUseIndex.xml
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
<query id="getDocumentDivisionUseIndex" action="select">
|
||||
<tables>
|
||||
<table name="documents" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<index_hint name="idx_list_order" type="use" />
|
||||
<conditions>
|
||||
<condition operation="in" column="module_srl" var="module_srl" filter="number" />
|
||||
<condition operation="notin" column="module_srl" var="exclude_module_srl" filter="number" pipe="and" />
|
||||
<condition operation="more" column="list_order" var="list_order" filter="number" pipe="and" />
|
||||
</conditions>
|
||||
<navigation>
|
||||
<index var="sort_index" default="list_order" order="order_type" />
|
||||
<list_count var="list_count" default="1" />
|
||||
<page_count var="page_count" default="1" />
|
||||
<page var="page" default="1" />
|
||||
</navigation>
|
||||
</query>
|
||||
50
modules/document/queries/getDocumentListUseIndex.xml
Normal file
50
modules/document/queries/getDocumentListUseIndex.xml
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
<query id="getDocumentList" action="select">
|
||||
<tables>
|
||||
<table name="documents" />
|
||||
</tables>
|
||||
<columns>
|
||||
<column name="*" />
|
||||
</columns>
|
||||
<index_hint name="idx_list_order" type="use" />
|
||||
<conditions>
|
||||
<condition operation="in" column="module_srl" var="module_srl" filter="number" />
|
||||
<condition operation="notin" column="module_srl" var="exclude_module_srl" filter="number" pipe="and" />
|
||||
<condition operation="in" column="category_srl" var="category_srl" pipe="and" />
|
||||
<condition operation="equal" column="is_notice" var="s_is_notice" pipe="and" />
|
||||
<condition operation="equal" column="member_srl" var="member_srl" filter="number" pipe="and" />
|
||||
<group pipe="and">
|
||||
<condition operation="more" column="list_order" var="division" pipe="and" />
|
||||
<condition operation="below" column="list_order" var="last_division" pipe="and" />
|
||||
</group>
|
||||
<group pipe="and">
|
||||
<condition operation="like" column="title" var="s_title" />
|
||||
<condition operation="like" column="content" var="s_content" pipe="or" />
|
||||
<condition operation="like" column="user_name" var="s_user_name" pipe="or" />
|
||||
<condition operation="like" column="user_id" var="s_user_id" pipe="or" />
|
||||
<condition operation="like" column="nick_name" var="s_nick_name" pipe="or" />
|
||||
<condition operation="like" column="email_address" var="s_email_addres" pipe="or" />
|
||||
<condition operation="like" column="homepage" var="s_homepage" pipe="or" />
|
||||
<condition operation="like" column="tags" var="s_tags" pipe="or" />
|
||||
<condition operation="equal" column="is_secret" var="s_is_secret" pipe="or" />
|
||||
<condition operation="equal" column="member_srl" var="s_member_srl" pipe="or" />
|
||||
<condition operation="more" column="readed_count" var="s_readed_count" pipe="or" />
|
||||
<condition operation="more" column="voted_count" var="s_voted_count" pipe="or" />
|
||||
<condition operation="more" column="comment_count" var="s_comment_count" pipe="or" />
|
||||
<condition operation="more" column="trackback_count" var="s_trackback_count" pipe="or" />
|
||||
<condition operation="more" column="uploaded_count" var="s_uploaded_count" pipe="or" />
|
||||
<condition operation="like_prefix" column="regdate" var="s_regdate" pipe="or" />
|
||||
<condition operation="like_prefix" column="last_update" var="s_last_update" pipe="or" />
|
||||
<condition operation="like_prefix" column="ipaddress" var="s_ipaddress" pipe="or" />
|
||||
</group>
|
||||
<group pipe="and">
|
||||
<condition operation="more" column="last_update" var="start_date" pipe="and" />
|
||||
<condition operation="less" column="last_update" var="end_date" pipe="and" />
|
||||
</group>
|
||||
</conditions>
|
||||
<navigation>
|
||||
<index var="sort_index" default="list_order" order="order_type" />
|
||||
<list_count var="list_count" default="20" />
|
||||
<page_count var="page_count" default="10" />
|
||||
<page var="page" default="1" />
|
||||
</navigation>
|
||||
</query>
|
||||
|
|
@ -2,6 +2,7 @@
|
|||
<tables>
|
||||
<table name="documents" />
|
||||
</tables>
|
||||
<priority type="low" />
|
||||
<columns>
|
||||
<column name="document_srl" var="document_srl" filter="number" notnull="notnull" />
|
||||
<column name="module_srl" var="module_srl" filter="number" default="0" />
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
<tables>
|
||||
<table name="documents" />
|
||||
</tables>
|
||||
<priority type="low" />
|
||||
<columns>
|
||||
<column name="module_srl" var="module_srl" filter="number" default="0" />
|
||||
<column name="category_srl" var="category_srl" filter="number" default="0" />
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue