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

 

posted @ 2020-04-24 22:35  夹竹桃  阅读(247)  评论(0编辑  收藏  举报