| 订阅 | 在线投稿
分享
 
 
 

MySQL数据库索引查询优化的分享

2008-12-22 08:07:51 编辑來源:互联网 国际版 评论
 
 
本文为【MySQL数据库索引查询优化的分享】的汉字拼音对照版显示拼音
  wentimiaoshu

  womenyao访fangwendebiaoshiyigefeichangdadebiaosiqianwantiaojiluidshizhujianprogram_idshangjianlesuoyin

  zhixingyitiaoSQL:

  select * from program_access_log where program_id between 1 and 4000

  zhetiaoSQLfeichangman

  womenyuanyiweichulijilutaiduodeyuanyinsuoyijialeidxianzhiyicizhiduwushiwantiaojilu

  select * from program_access_log where id between 1 and 500000 and program_id between 1 and 4000

  danshizhetiaoSQLrengranhenmansudubishangmianyitiaojihumeiyoutisheng

  Mysqlchuli50wantiaojiludebiaotiaojianziduanhuanjianlesuoyinzhetiaoyujuyinggaishishunjianwanchengde

  wentifenxi

  zhezhangbiaodayuerongliang30Gshujukufuwuqineicun16Gwufayicizairujiushizhegezaochenglewenti

  zhetiaoSQLyoulianggetiaojianIDyidaowushiwanheProgram_idyidaosiqianyinweiprogram_idfanweixiaodeduomysqlxuanzetazuoweizhuyaosuoyin

  xiantongguosuoyinwenjianzhaochulesuoyouprogram_idzai1dao4000fanweilisuoyoudeidzhegeguochengfeichangkuai

  jiexialaiyaotongguozhexieidzhaochubiaolidejiluyouyuzhexieidshilisandesuoyimysqlduizhegebiaode访fangwenbushishunxuduqu

  erzhegebiaoyoufeichangdawufayicizhuangruneicunsuoyimei访fangwenyitiaojilumysqldouyaochongxinzaicipanshangdingweibingbafujindejiludouzairuneicundaliangdeIOcaozuodaozhilesududexiajiang

  wentijiejuefangan

  1. yiprogram_idweitiaojianduibiaojinxingfenqu

  2. fenbiaochulimeizhangbiaodedaxiaobuchaoguoneicundedaxiao

  ranerfuwuqiyongdeshimysql5.0buzhichifenquerqiezhegebiaoshigonggongbiaowufazaibuyingxiangqitaxiangmudetiaojianxiaxiugaibiaodejiegou

  suoyiwomencaiquledisanzhongbanfa

  select * from program_access_log where id between 1 and 500000 and program_id between 1 and 15000000

  xianzaiprogram_iddefanweiyuandayuiddefanweiidbeidangzuozhuyaosuoyinjinxingchazhaoyouyuidshizhujiansuoyichazhaodeshilianxu50wantiaojilusuduhe访fangwenyige50wantiaojiludebiaojibenyiyang

  zongjie

  zheshiyigezaiqianwanbijilubiaozhongyouyu使shiyonglesuoyindaozhileshujuchazhaobianmandewentiyouyidingdedianxingxinghedajiajiaoliuxia原文
 
 
问题描述: 我们要访问的表是一个非常大的表,四千万条记录,id是主键,program_id上建了索引。 执行一条SQL: select * from program_access_log where program_id between 1 and 4000 这条SQL非常慢。 我们原以为处理记录太多的原因,所以加了id限制,一次只读五十万条记录 select * from program_access_log where id between 1 and 500000 and program_id between 1 and 4000 但是这条SQL仍然很慢,速度比上面一条几乎没有提升。 Mysql处理50万条记录的表,条件字段还建了索引,这条语句应该是瞬间完成的。 问题分析: 这张表大约容量30G,数据库服务器内存16G,无法一次载入。就是这个造成了问题。 这条SQL有两个条件,ID一到五十万和Program_id一到四千,因为program_id范围小得多,mysql选择它做为主要索引。 先通过索引文件找出了所有program_id在1到4000范围里所有的id,这个过程非常快。 接下来要通过这些id找出表里的记录,由于这些id是离散的,所以mysql对这个表的访问不是顺序读取。 而这个表又非常大,无法一次装入内存,所以每访问一条记录mysql都要重新在磁盘上定位并把附近的记录都载入内存,大量的IO操作导致了速度的下降。 问题解决方案: 1. 以program_id为条件对表进行分区 2. 分表处理,每张表的大小不超过内存的大小 然而,服务器用的是mysql5.0,不支持分区,而且这个表是公共表,无法在不影响其它项目的条件下修改表的结构。 所以我们采取了第三种办法: select * from program_access_log where id between 1 and 500000 and program_id between 1 and 15000000 现在program_id的范围远大于id的范围,id被当做主要索引进行查找,由于id是主键,所以查找的是连续50万条记录,速度和访问一个50万条记录的表基本一样 总结: 这是一个在千万笔记录表中由于使用了索引导致了数据查找变慢的问题,有一定的典型性和大家交流下!
󰈣󰈤
日版宠物情人插曲《Winding Road》歌词

日版宠物情人2017的插曲,很带节奏感,日语的,女生唱的。 最后听见是在第8集的时候女主手割伤了,然后男主用嘴帮她吸了一下,插曲就出来了。 歌手:Def...

兄弟共妻,我成了他们夜里的美食

老钟家的两个儿子很特别,就是跟其他的人不太一样,魔一般的执着。兄弟俩都到了要结婚的年龄了,不管自家老爹怎么磨破嘴皮子,兄弟俩说不娶就不娶,老父母为兄弟两操碎了心...

网络安全治理:国家安全保障的主要方向是打击犯罪,而不是处置和惩罚受害者

来源:中国青年报 新的攻击方法不断涌现,黑客几乎永远占据网络攻击的上风,我们不可能通过技术手段杜绝网络攻击。国家安全保障的主要方向是打击犯罪,而不是处置和惩罚...

 
 
 
>>返回首页<<
 为你推荐
 
 
 
 转载本文
 UBB代码 HTML代码
复制到剪贴板...
 
 
 热帖排行
 
清纯得让人窒息(7)
清纯得让人窒息(6)
天泽海韵宣传片
赣州文庙
 
 
王朝网络微信公众号
微信扫码关注本站公众号wangchaonetcn
 
  免责声明:本文仅代表作者个人观点,与王朝网络无关。王朝网络登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
©2005- 王朝网络 版权所有