MySQL百万级数据量分页查询方法及其优化建议

offset+limit方式的分页查询,当数据表超过100w条记录,性能会很差。
主要原因是offset limit的分页方式是从头开始查询,然后舍弃前offset个记录,所以offset偏移量越大,查询速度越慢。

比如: 读第10000到10019行元素(pk是主键/唯一键).

使用order by id可以在查询时使用主键索引。
但是这种方式在id为uuid的时候就会出现问题。可以使用where in的方式解决:

带条件的查询:
如果在分页查询中添加了where条件例如 type = 'a’这样的条件,sql变成 :

这种情况因为type没有使用索引也会导致查询速度变慢。但是只添加type为索引查询速度还是很慢,是因为查询的数据量太多了。这个时候考虑添加组合索引,组合索引的顺序要where条件字段在前,id在后,如 (type,id),因为组合索引查询时用到了type索引,而type跟id是组合索引的关系,如果只select id ,那么直接就可以按组合索引返回id,而不需要再进行一次查询去返回id

使用uuid作为主键不仅会带来性能上的问题,在查询时也会遇到问题。

因为在使用select id from table limit 10000,10 查询id数据时,默认是对id进行排序,返回的是排序后的id结果,如果我们想按插入顺序查询结果,这样查询出来的结果就与我们的需求不相符。

聚集索引跟非聚集索引:聚集索引类似与新华字典的拼音,根据拼音搜索到的信息都是连续的,可以很快获取到它前后的信息。非聚集索引类似于部首查询,信息存放的位置可能不在一个区域。对经常使用范围查询的字段考虑使用聚集索引。

InnoDB中索引分为聚簇索引(主键索引)和非聚簇索引(非主键索引),聚簇索引的叶子节点中保存的是整行记录,而非聚簇索引的叶子节点中保存的是该行记录的主键的值。

如果您的表上定义有主键,该主键索引是聚集索引。
如果你不定义为您的表的主键时,MySQL取第一个唯一索引(unique)而且只含非空列(NOT NULL)作为主键,InnoDB使用它作为聚集索引。
如果没有这样的列,InnoDB就自己产生一个这样的ID值,
优先选index key_len小的索引进行count(*),尽量不使用聚簇索引

在没有where条件的情况下,count(*)和count(常量),如果有非聚簇索引,mysql会自动选择非聚簇索引,因为非聚簇索引所占的空间小,如果没有非聚簇索引会使用聚集索引。count(primary key)主键id为聚集索引,使用聚集索引。有where条件的情况下,是否使用索引会根据where条件判断。

  • 濡備綍閫氱敤瀛樺偍杩囩▼鏉ュMySQL鍒嗛〉鏌ヨ杩涜鎿嶄綔
    绛旓細鏈涗綘娴忚涔嬪悗鑳芥湁鎵鏀惰幏銆傚墠娈垫椂闂存病鏈夌粰鍑篠QLServer杞埌MySQL(鍜孭HP鎼厤涔嬫渶浣崇粍鍚)鐨勯氱敤瀛樺偍杩囩▼锛屾湰鐫鍏变韩鐨勭簿绁烇紝涓哄ぇ瀹跺鐚繖娈MySQL鍒嗛〉鏌ヨ閫氱敤瀛樺偍杩囩▼锛屽亣璁炬墍鐢鏁版嵁搴撲负guestbook锛歶se guestbook; delimiter $$ drop procedure if exists prc_page_result $$ create procedure prc_page_result (...
  • 澶鏁版嵁閲涓嬬殑鍒嗛〉瑙e喅鏂规硶
    绛旓細澶鏁版嵁閲涓嬬殑鍒嗛〉瑙e喅鏂规硶锛氳鐪嬩綘鐨勬暟鎹瓨鍌ㄦ槸鐢ㄧ殑浠涔堟暟鎹簱浜嗐傚父鐢ㄧ殑鏈mysql锛宻qlserver锛宱racle銆傛病绉嶆暟鎹簱杩涜鍒嗛〉鐨凷QL璇彞涓嶅悓銆傚仛澶鏁版嵁鍒嗛〉閮芥槸鏃犲埛鏂扮殑鎶鏈紝杩欓噷鎴戜滑閫夋嫨ajax鏉ュ疄鐜般俛jax璇锋眰鍦板潃闇瑕佷綘浣跨敤鍚庡彴浠g爜鏉ュ疄鐜帮紝鍚庡彴浠g爜闄や簡瑕佽繑鍥炴暟鎹泦鍚堣繕瑕佽繑鍥炴暟鎹殑鎬绘暟閲忥紝鎬婚〉鏁帮紝涓嬩竴椤电瓑...
  • 濡備綍浼樺寲Mysql鍗冧竾绾у揩閫鍒嗛〉
    绛旓細PS: 缁忚繃瀹為檯娴嬭瘯锛屽埌浜100涓囩殑鏁版嵁锛160涓囨暟鎹紝15G琛紝190M绱㈠紩锛屽氨绠楄蛋绱㈠紩锛宭imit閮藉緱0.49绉掋傛墍浠ュ垎椤垫渶濂藉埆璁╁埆浜虹湅鍒10涓囨潯浠ュ悗鐨勬暟鎹紝瑕佷笉鐒朵細寰堟參锛佸氨绠楃敤绱㈠紩銆傜粡杩囪繖鏍风殑浼樺寲锛mysql鍒颁簡鐧句竾绾у垎椤鏄釜鏋侀檺锛佷絾鏈夎繖鏍风殑鎴愮哗宸茬粡寰堜笉閿欙紝濡傛灉浣犳槸鐢╯qlserver鑲畾鍗℃锛佽 160涓囩殑鏁版嵁鐢...
  • 鏁版嵁閲澶ぇ瀵艰嚧鍒嗛〉鏌ヨ鏃舵參鎬庝箞澶勭悊
    绛旓細鏅氬啓娉曪細select * from buyer where sellerid=100 limit 100000,20 鏅歭imit M, N 鐨勭炕椤靛啓娉曪紝鍦ㄨ秺寰鍚庣炕椤电殑杩囩▼涓熷害瓒婃參锛屽師鍥mysql浼氳鍙栬〃涓墠M+N鏉鏁版嵁锛孧瓒婂ぇ锛屾ц兘灏辫秺宸
  • 缁撳悎MySQL鏁版嵁搴,濡備綍瀹炵幇鍒嗛〉鍔熻兘
    绛旓細绗竴姝ワ細鎴戜滑鍙互鍒╃敤$_GET鏂规硶鑾峰彇鏌愪竴涓弬鏁扮殑鍊硷紝鍦ㄧ敤鎴风偣鍑讳笂涓椤点佷笅涓椤点侀椤垫垨鑰呮湯椤垫椂鑾峰彇涓嶅悓鐨勫姩鎬佸弬鏁 绗簩姝ワ細鏍规嵁MySQL鐨limit鍏抽敭瀛楋紝瀵瑰姩鎬佸弬鏁拌繘琛孲QL璇彞鎷兼帴 灏嗗畾涔夋瘡椤垫樉绀虹殑鏁版嵁鏉℃暟锛屽湪limit绗竴涓弬鏁扮殑浣嶇疆涓紝鏍规嵁鍦板潃鏍忓弬鏁扮殑鍔ㄦ佸彉鍖栦粠鑰屽疄鐜版寚瀹氫粠绗嚑鏉℃暟鎹紑濮嬫樉绀烘暟鎹 ...
  • mysql鍜宱racle鐨鍒嗛〉鏌ヨ鐨勫尯鍒
    绛旓細瀹炵幇鏂瑰紡锛屾ц兘浼樺寲銆1銆佸疄鐜版柟寮忥細鍦mysql涓紝鍒嗛〉鏌ヨ閫氬父浣跨敤LIMIT鍜宱racle瀛愬彞銆侺IMIT鐢ㄤ簬闄愬埗杩斿洖鐨勮鏁帮紝OFFSET鐢ㄤ簬鎸囧畾寮濮嬭繑鍥炵殑琛屾暟锛屽湪oracle涓紝鍒嗛〉鏌ヨ鍙互浣跨敤ROWNUM浼垪鎴朏ETCHFIRST璇硶銆2銆佹ц兘浼樺寲锛氬湪mysql涓紝瑕佹煡璇㈢殑鏁版嵁閲寰堝ぇ锛屼娇鐢↙IMIT鍜孫FFSET浼氶犳垚鎬ц兘闂锛岃繖鏄痬ysql闇瑕佹壂鎻忓苟璺宠繃...
  • 澶鏁版嵁閲瀹炴椂缁熻鎺掑簭鍒嗛〉鏌ヨ 浼樺寲鎬荤粨
    绛旓細澶鏁版嵁閲瀹炴椂缁熻鎺掑簭鍒嗛〉鏌ヨ (骞跺彂鏁拌緝灏忔椂) 鐨勭摱棰堜笉鏄嚱鏁帮紙count锛宻um绛夛級鎵ц锛屼笉鏄痟aving, 涔熶笉鏄痮rder by锛岀敋鑷充笉鏄〃join, 瀵艰嚧鎱㈢殑鍘熷洜灏卞湪浜庘滄暟鎹噺澶ぇ鏈韩鈥濆氨鏄皢琛ㄥ垝鍒嗕负M浠界浉浜掔嫭绔嬬殑閮ㄥ垎,鍙互鏄垎琛紝涔熷彲浠ユ槸涓嶅垎琛ㄤ絾鍐椾綑涓涓彇妯$粨鏋滃瓧娈 瀹為檯缁撴灉鏄笉鍒嗚〃姣斿垎琛ㄦ洿鍔犵伒娲伙紝鍙...
  • Oracle, SQL Server, My SQL濡備綍瀹炵幇鏁版嵁鍒嗛〉鏌ヨ璇彞
    绛旓細鍘熷洜鏄浜岀瑕佹妸瀛鏌ヨ鎵ц瀹岋紝鑰岀涓绉嶆柟娉曞瓙鏌ヨ鎵ц鍒癛ownum=40鍚庡氨缁撴潫浜嗐MySQL:SELECT * FROM TABLE_NAME LIMIT 10, 20琛ㄧず浠庣11鏉鏁版嵁寮濮嬪彇20鏉℃暟鎹繑鍥烇紝limit鍚庣殑2涓弬鏁板惈涔変负锛氳捣鐐瑰拰姝ラ暱锛屽嵆浠庨偅鏉℃暟鎹紑濮嬶紝鍙栧灏戞潯鏁版嵁锛屽啀濡傚彇鍓20鏉℃暟鎹細SELECT * FROM TABLE_NAME LIMIT 0,...
  • mysql,鏈変竴寮犺〃閲岄潰宸茬粡鏈夊嚑鍗冧竾鏉鏁版嵁浜,缃戦〉璁块棶鏃舵瀬鍏剁紦鎱,濡備綍鎻愰珮...
    绛旓細00:10:00' and '2012-11-01 00:11:10';鏌ョ湅寤虹珛绱㈠紩鍓嶉潰鐨勮繑鍥炵殑缁撴灉銆傚亣濡傛病鏈夌储寮曠殑璇濓紝explain浼氭樉绀鸿繑鍥鏌ヨ鍏ㄨ〃鐨勬暟鎹嚜鐒朵細寰堟參浜嗐傚亣濡傜敤鍒颁簡绱㈠紩鐨勮瘽锛屽彲浠ュ揩閫熺殑鎵惧埌闇瑕佹煡璇㈢殑鍖洪棿閲岀殑鏁版嵁锛屽線寰闇瑕佹煡璇㈢殑鏁版嵁閲鏄叏琛ㄧ殑1/100,1/1000锛岄偅涔堣繖鏃跺欒姳璐圭殑鏃堕棿灏辨槸1/100,1/1000浜嗐
  • Mysql浣跨敤limit娣卞害鍒嗛〉浼樺寲
    绛旓細mysql浣跨敤select * limit offset, rows鍒嗛〉鍦ㄦ繁搴﹀垎椤电殑鎯呭喌涓嬨傛ц兘鎬ュ墽涓嬮檷銆俵imit鐢ㄤ簬鏁版嵁鐨鍒嗛〉鏌ヨ锛屽綋鐒朵篃浼氱敤浜庢暟鎹殑鎴彇锛屼笅闈㈡槸limit鐨勭敤娉曪細1. 妯′豢鐧惧害銆佽胺姝屾柟妗堬紙鍓嶇涓氬姟鎺у埗锛夌被浼间簬鍒嗘銆傛垜浠粰姣忔鍙兘缈100椤点佽秴杩囦竴鐧鹃〉鐨勯渶瑕侀噸鏂板姞杞藉悗闈㈢殑100椤点傝繖鏍峰氨瑙e喅浜嗘瘡娆″姞杞芥暟閲忔暟鎹ぇ 閫熷害...
  • 扩展阅读:mysql分页查询limit ... 数据统计表格 ... 数据查询网站 ... mysql的分页查询语句 ... mysql千万数据查询优化 ... mysql in查询数据量大 ... mysql offset ... mysql limit分页 ... mysql的三种分页方法 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网