mysql百万级别数据查询心得

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">作为第一次接触百万级别数据的查询的我来说一直觉得这是很神奇很强大的一门技术,总以为需要进行表分割啊,负载均衡之类的才能做到查询优化。其实不然,这个级别的数据查询我们只需要有效的利用索引,书写比较高效的sql就能做到(所谓比较高效其实就是尽量少用is not null  , 不要使用like ‘%XX’等会造成索引失效的sql啦,这个度娘上很多例子的)。</span>

就我自己的案例讲讲一些注意事项吧:

这是我的sql语句(还有很多没优化的):

select * from(
	SELECT
		`REPTILE_AUDIO_INFO`.`name` AS `name`,
		`REPTILE_AUDIO_INFO`.`id` AS `id`,
		`REPTILE_AUDIO_INFO`.`content` AS `content`,
		`REPTILE_AUDIO_INFO`.`type` AS `type`,
		`REPTILE_AUDIO_INFO`.`categoryId` AS `categoryId`,
		`REPTILE_AUDIO_INFO`.`status` AS `status`,
		`REPTILE_AUDIO_INFO`.`area` AS `area`,
		`REPTILE_AUDIO_INFO`.`tags` AS `tags`,
		`REPTILE_AUDIO_INFO`.`keywords` AS `keywords`,
		`REPTILE_AUDIO_INFO`.`sourceUrl` AS `sourceUrl`,
		`REPTILE_AUDIO_INFO`.`cover` AS `cover`,
		`REPTILE_AUDIO_INFO`.`ownerUrl` AS `visitPath`,
		`REPTILE_AUDIO_INFO`.`createDate` AS `createTime`,
		`REPTILE_AUDIO_INFO`.`isHot` AS `ishot`,
			si.id AS sectionId,
			`si`.`parentId` AS `sectionParent`,
			`si`.`sectionName` AS `sectionName`
	FROM
		`REPTILE_AUDIO_INFO`
	JOIN `SECTION_CONTENT` `sc` ON `sc`.`contentId` = `REPTILE_AUDIO_INFO`.`id`
	JOIN `SECTION_INFO` `si` ON `si`.`id` = `sc`.`sectionId`

	UNION ALL
		SELECT
			`REPTILE_AUDIO_INFO`.`name` AS `name`,
			`REPTILE_AUDIO_INFO`.`id` AS `id`,
			`REPTILE_AUDIO_INFO`.`content` AS `content`,
			`REPTILE_AUDIO_INFO`.`type` AS `type`,
			`REPTILE_AUDIO_INFO`.`categoryId` AS `categoryId`,
			`REPTILE_AUDIO_INFO`.`status` AS `status`,
			`REPTILE_AUDIO_INFO`.`area` AS `area`,
			`REPTILE_AUDIO_INFO`.`tags` AS `tags`,
			`REPTILE_AUDIO_INFO`.`keywords` AS `keywords`,
			`REPTILE_AUDIO_INFO`.`sourceUrl` AS `sourceUrl`,
			`REPTILE_AUDIO_INFO`.`cover` AS `cover`,
			`REPTILE_AUDIO_INFO`.`ownerUrl` AS `visitPath`,
			`REPTILE_AUDIO_INFO`.`createDate` AS `createTime`,
			`REPTILE_AUDIO_INFO`.`isHot` AS `ishot`,
			si.id AS sectionId,
			`si`.`parentId` AS `sectionParent`,
			`si`.`sectionName` AS `sectionName`
		FROM
			`REPTILE_AUDIO_INFO`
		JOIN `SECTION_CATEGORY` `sca` ON `REPTILE_AUDIO_INFO`.`categoryId` = `sca`.`categoryId`
		JOIN `SECTION_INFO` `si` ON `si`.`id` = `sca`.`sectionId`
	
UNION ALL
	
		SELECT
			`rvi`.`name` AS `name`,
			`rvi`.`id` AS `id`,
			`rvi`.`description` AS `content`,
			`rvi`.`type` AS `type`,
			`rvi`.`category` AS `categoryId`,
			`rvi`.`status` AS `status`,
			`rvi`.`area` AS `area`,
			`rvi`.`tags` AS `tags`,
			`rvi`.`keywords` AS `keywords`,
			`rvi`.`sourceUrl` AS `sourceUrl`,
			`rvp`.`visitPath` AS `cover`,
			`rvm`.`visitPath` AS `visitPath`,
			`rvi`.`createTime` AS `createTime`,
			`rvi`.`hotLevel` AS `ishot`,
			 si.id AS sectionId,
			`si`.`parentId` AS `sectionParent`,
			`si`.`sectionName` AS `sectionName`
		FROM
			`REPTILE_VIDEO_INFO` `rvi`
		LEFT JOIN `REPTILE_VIDEO_MEDIA` `rvm` ON `rvi`.`id` = `rvm`.`videoId`
		LEFT JOIN `REPTILE_VIDEO_PICTURE` `rvp` ON `rvp`.`videoId` = `rvi`.`id`
		JOIN `SECTION_CONTENT` `sc` ON `sc`.`contentId` = `rvi`.`id`
	  JOIN `SECTION_INFO` `si` ON `si`.`id` = `sc`.`sectionId`
		WHERE
			sectionId = 1
		
		UNION ALL
			SELECT
				`rvi`.`name` AS `name`,
				`rvi`.`id` AS `id`,
				`rvi`.`description` AS `content`,
				`rvi`.`type` AS `type`,
				`rvi`.`category` AS `categoryId`,
				`rvi`.`status` AS `status`,
				`rvi`.`area` AS `area`,
				`rvi`.`tags` AS `tags`,
				`rvi`.`keywords` AS `keywords`,
				`rvi`.`sourceUrl` AS `sourceUrl`,
				`rvp`.`visitPath` AS `cover`,
				`rvm`.`visitPath` AS `visitPath`,
				`rvi`.`createTime` AS `createTime`,
				`rvi`.`hotLevel` AS `ishot`,
				si.id AS sectionId,
				`si`.`parentId` AS `sectionParent`,
				`si`.`sectionName` AS `sectionName`
			FROM
				`REPTILE_VIDEO_INFO` `rvi`
			LEFT JOIN `REPTILE_VIDEO_MEDIA` `rvm` ON `rvi`.`id` = `rvm`.`videoId`
			LEFT JOIN `REPTILE_VIDEO_PICTURE` `rvp` ON `rvp`.`videoId` = `rvi`.`id`
			JOIN `SECTION_CATEGORY` `sca` ON `rvi`.`category` = `sca`.`categoryId`
			JOIN `SECTION_INFO` `si` ON `si`.`id` = `sca`.`sectionId`
			WHERE
				sectionId = 1) a group by id,type


1.这个大家都知道的,对于where ,order by后面的字段再不影响修改插入的情况下一般都会加上索引

2.对于left join on后面跟着的字段也要加上索引,不然会进行全表的搜索

3.在书写 sql时我们如何查看是否用到索引呢?我们可以在sql语句前加一个explain

4.对于搜索引擎是innodb的时候使用count()时尽量用在二级索引上,对于主键索引或者聚簇索引使用count会比二级索引 上使用count会慢差不多一倍

5.项目中还是尽量别使用myIsam引擎,不支持事务真心伤不起~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麦田小猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值