mysq 索引相关知识
之前为了图方便,在向表里插入数据得时候经常会用到这样一个语句insert into tablA select * from tableB,但是今天看到一篇文章,瞬时点醒了我,这样使用会有很大得问题,我得理解是:
--》select * from tableB 是进行得全表搜索,在搜索时会出现锁表得情况,这样一来,在同时有向tableB表插入数据得时候,就会报错。
所以:
解决这种问题得办法是:创建索引,且是聚合索引,这样在查询时候就无需进行回表操作,不回表,就不存在锁表得情况,
但是:
问题来了,如果所建得索引走不上,因为mysql也有自己得一套优化机制,如果它发现你得优化还不如它,它就会走自己得优化方式,所以你这时可能需要强制走这么一个索引,方式为
INSERT INTO order_record SELECT
*
FROM
order_today FORCE INDEX (idx_pay_suc_time)
WHERE
pay_success_time <= '2020-03-08 00:00:00';
如果不想走任何索引得方式是:
可以使用ignore index(),这个指令可以强制Mysql在查询时,不使用某索引。
select CustName,count(1) c from WorkOrder ignore index(ix_date) where CreateDate>'2016-5-1' and CreateDate<'2017-1-1' group by CustName having c>100 order by c desc;
参考文章:https://mp.weixin.qq.com/s?__biz=MzAxNjk4ODE4OQ==&mid=2247488692&idx=2&sn=73fa5ef914565806f06b2a03af627047&chksm=9bed35c6ac9abcd092cf60567f153a563631fb8a075deedb6a2b2f0dae088d4d88231a470b9a&scene=126&sessionid=1587691813&key=fd05e963367db14312f801c979b57b1f789eb5049916c6a262ef720b9bda303f9c39736362d348c0fe5b6a545bd53fc848d8e947dbbc684c7e6971b8de7e5bbae2599991eb06457b3e4091fc0d0b5083&ascene=1&uin=MjIzMzc4NzQxMA%3D%3D&devicetype=Windows+10&version=62080079&lang=zh_CN&exportkey=A%2BJbZmzkes42i9V2mLb0KLU%3D&pass_ticket=KViBI%2BIFLoHZqmRopC3RGpIam4wW%2F1cmY5hAuj76Mpd%2B6G6s8FE8tQu%2FcD6z7tZt