分页查询十万条以上数据的sql语句

版权声明:本文为博主原创文章,希望能与大家共享。 https://blog.csdn.net/dunegao/article/details/79267331

普通的select语句当查询超过10万条语句列表时速度会严重影响,下面是公司DBA写出的优化版的sql语句

 <!-- 获取POIlist -->
    <select id="getPoiInfoList"  resultMap="PoiInfoRVO">
				SELECT T.POI_ID,
					   T.POI_NAME,
					   T.X_AXIS,
					   T.Y_AXIS,
					   T.POI_STATE,
					   T.POI_DESC,
					   T.POI_ADDRESS,
					   T.THUMBNAIL,
					   T.AREA,
					   T.CITY,
					   T.POI_TYPE,
					   T.SALES_VOLUME,
					   T.ASCRIPTION
				  FROM T_POI_INFO T
				 INNER JOIN ( SELECT s.POI_ID FROM T_POI_INFO s WHERE s.DELFLAG = '0' AND  s.POI_TYPE = #{poiType,jdbcType=VARCHAR}  AND  s.POI_STATE = #{poiState,jdbcType=VARCHAR} ORDER BY POI_ID DESC LIMIT #{begin},#{count}) f USING (POI_ID)
				 WHERE T.DELFLAG='0'
				 AND T.POI_TYPE =#{poiType,jdbcType=VARCHAR}
				 AND T.POI_STATE =#{poiState,jdbcType=VARCHAR}
					<if test="poiName != '' and poiName != null">
						AND T.POI_NAME LIKE CONCAT('%',#{poiName},'%')
					</if>
					<if test="area != '' and area != null">
						AND T.AREA LIKE CONCAT('%',#{area},'%')
					</if>
					<if test="city != '' and city != null">
						AND T.CITY LIKE CONCAT('%',#{city},'%')
					</if>
					<if test="ascription != '' and ascription != null">
						AND T.ASCRIPTION =#{ascription,jdbcType=VARCHAR}
					</if>
		    	ORDER BY T.POI_ID DESC
    </select>
但是进行分页是,需要查询下总条数:

 <!-- 获取POIsum -->
    <select id="getPoiInfoCount"  resultType="int">
    		SELECT COUNT(T.POI_ID) 
    		FROM T_POI_INFO T
    		WHERE T.DELFLAG='0'
    		AND T.POI_TYPE =#{poiType}
		    AND T.POI_STATE =#{poiState}
			<if test="poiName != '' and poiName != null">
				AND T.POI_NAME LIKE CONCAT('%',#{poiName},'%')
			</if>
			<if test="area != '' and area != null">
				AND T.AREA LIKE CONCAT('%',#{area},'%')
			</if>
			<if test="city != '' and city != null">
				AND T.CITY LIKE CONCAT('%',#{city},'%')
			</if>
			<if test="ascription != '' and ascription != null">
				AND T.ASCRIPTION =#{ascription}
			</if>
    </select>
如果直接运行这条sql也会出现超过一分钟的查询时间。

目前想到的处理办法供大家借鉴,可以说不是很准确。

从业务逻辑上讲,人们翻页时一般及其有耐心的人也不会翻到100页,因此,我可以先查询第100页的数据

如果有数据,说明数据量特别大,我们就不再调取查询总计量的sql语句,默认给一个上限页数100页。就节省了查总条数的查询时间。

如果没有数据,说明数据量不大,那我们就正常执行查询总条数的sql语句。正常分页处理

猜你喜欢

转载自blog.csdn.net/dunegao/article/details/79267331