mysql查询大量数据,比如几十万条的时候,cpu占用率都彪到100%了,我是四个表联表查询,这个怎么优化啊

草泥马戈壁蛋 发布于 2013/07/26 10:55
阅读 4K+
收藏 2

1、表名:
#define TABLE_USER_INFO      (LPCSTR)"user_info"     // 用户信息
#define TABLE_MT_DEVICE_PROFILE    (LPCSTR)"mt_device_profile"   // 终端设备属性
#define TABLE_USER_PROFILE     (LPCSTR)"user_profile"    // 用户属性
#define TABLE_COMPANY_CONF_PROFILE   (LPCSTR)"company_conf_profile"  // 公司会议属性

 

2、各表的字段:
// 用户信息表(user_info)
#define USER_MOID       (LPCSTR)"moid"     //
#define USER_PASSWORD      (LPCSTR)"password" //
#define USER_E164_NO      (LPCSTR)"e164"     //
#define USER_TEL       (LPCSTR)"tel"     //
#define USER_EMAIL       (LPCSTR)"email"     //
#define USER_COMPANY_MOID     (LPCSTR)"company_moid" //
#define USER_ACCOUNT_TYPE     (LPCSTR)"account_type" //
#define USER_BINDED       (LPCSTR)"binded"     //
#define USER_USED_FLAG      (LPCSTR)"enable"     //

#define USER_ACCOUNT_TYPE_EMAIL    (u8)0 //email类型的用户 
#define USER_ACCOUNT_TYPE_E164    (u8)1 //E164类型的用户


// 终端设备属性表(mt_device_profile)
#define MT_DEVICE_MOID      (LPCSTR)"moid"     //
#define MT_DEVICE_GUID      (LPCSTR)"device_guid"     //
#define MT_DEVICE_TYPE      (LPCSTR)"device_type"     //
#define MT_DEVICE_IP      (LPCSTR)"device_ip"     //
#define MT_DEVICE_CSU_GUID     (LPCSTR)"csu_guid"     //


// 用户属性表(user_profile)
#define USER_PROFILE_MOID     (LPCSTR)"moid"     //
#define USER_PROFILE_NAME     (LPCSTR)"name"    //


// 企业会议属性表(company_conf_profile)
#define COMPANY_PROFILE_MOID    (LPCSTR)"company_moid"
#define COMPANY_DOMAIN_GUID     (LPCSTR)"domain_guid"
#define COMPANY_SUP_DOMAIN_GUID    (LPCSTR)"superior_domain_guid"
#define COMPANY_BILLING_ID     (LPCSTR)"billing_id"
#define COMPANY_CSU_GUID     (LPCSTR)"csu_guid"
#define COMPANY_ADDRESS      (LPCSTR)"address"
#define COMPANY_LINKMAN_NAME    (LPCSTR)"linkman_name"
#define COMPANY_PHONE_NUM     (LPCSTR)"phone_num"
#define COMPANY_EMAIL      (LPCSTR)"email"
#define COMPANY_MAX_CONF_NUM    (LPCSTR)"max_conf_num"
#define COMPANY_MAX_CASCADE_CONF_NUM  (LPCSTR)"max_cascade_conf_num"
#define COMPANY_MAX_ROAM_NUM    (LPCSTR)"max_roam_num"
#define COMPANY_MAX_OUT_NUM     (LPCSTR)"max_out_num"
#define COMPANY_MAX_INCOMING_NUM   (LPCSTR)"max_incoming_num"
#define COMPANY_MAX_PHONE_CALL_NUM   (LPCSTR)"max_phone_call_num"
#define COMPANY_INTERNATIONAL_CALL_FLAG  (LPCSTR)"international_call_flag"
#define COMPANY_VOIP_NUM     (LPCSTR)"voip_num"
#define COMPANY_MAX_H323_CALL_NUM           (LPCSTR)"max_h323_call_num"
#define COMPANY_ADMIN_NAME                  (LPCSTR)"admin_name"
#define COMPANY_ADMIN_PWD                   (LPCSTR)"admin_password"
#define COMPANY_SATELLITE_CONF_FLAG         (LPCSTR)"satellite_conf_flag"
#define COMPANY_MULTICAST_IP                (LPCSTR)"multicast_ip"
#define COMPANY_MAX_UPLOAD_NUM              (LPCSTR)"max_upload_num"


3、我之前查询的时候,先查询所有终端的个数,然后根据查询个数建个索引,然后一次查50个,

 u16 wSeesionID = ptExtend->GetSessionID();
 u32 dwPackIndex = ptExtend->GetDetailBody();
 
 //查询终端的topo列表
 CTnmDevTopoList tTopoList;
 u32 dwOffset = dwPackIndex * tTopoList.GetMaxListSize(); //tTopoList.GetMaxListSize()是50个
 u16 wErrId = pcTASOprDB->GetMtTopoInfo(dwOffset, tTopoList);

        tTopoList.Init();
 
 TSqlString tSqlStr;
 u16 wRet = SUCCESS_DBENGINE;
 
 //查询终端topo信息
 tSqlStr.Format("SELECT DISTINCT A.*, B.*, C.%s, D.%s FROM %s A, %s B, %s C, %s D WHERE \
  A.%s = %u AND A.%s = %u And A.%s = B.%s AND A.%s = C.%s AND A.%s = D.%s limit %d, %d ",
  USER_PROFILE_NAME, COMPANY_DOMAIN_GUID,
  TABLE_USER_INFO, TABLE_MT_DEVICE_PROFILE,
  TABLE_USER_PROFILE, TABLE_COMPANY_CONF_PROFILE,
  USER_ACCOUNT_TYPE, USER_ACCOUNT_TYPE_E164,
  USER_USED_FLAG, USE_FLAG_ENABLE,
  USER_MOID, MT_DEVICE_MOID,
  USER_MOID, USER_PROFILE_MOID,
  USER_COMPANY_MOID, COMPANY_PROFILE_MOID,
  dwOffset, tTopoList.GetMaxListSize() );

 

 

 

加载中
0
宏哥
宏哥
又一个不坚持两个凡是 ,可怜的人。
李永波
李永波
回复 @小窝 : 范式
草泥马戈壁蛋
草泥马戈壁蛋
不坚持两个凡是,啥意思?
0
铂金小鱼
铂金小鱼
没得优化,因为mysql真心恶心
草泥马戈壁蛋
草泥马戈壁蛋
0
sevendlong
sevendlong

mysql有它的使用场景,olap系统使用mysql可能不是最佳选择,但也不是不可。

mysql查询尽量采用n+1,优化可以从索引、缓存角度考虑。数据量过大可以考虑水平垂直拆表。

0
mark35
mark35

连表查询啊? mysql这货没得优化的,要么升级硬件来堆性能要么换数据库 。

几十万条就算大数据了啊…… 后面再加两个零吧

0
吕秀才
吕秀才
如果sql语句复杂或者查询慢的话,可以把sql语句拆开,分多次查询!这个也是一个优化的原则
0
王瑞平
王瑞平
建立视图
0
Smile月光
Smile月光
几十万条,换oracle
0
南湖船老大
南湖船老大

引用来自“王瑞平”的答案

建立视图
你又来搞笑了
返回顶部
顶部