问题:单表200w 需要根据时间去扫全表。
数据表 :order 索引:create_time
优化前:
select * from order where create_time < '2021-11-18' and status = 8;
mysql范围查询范围查询如果where后面查询的数据量大于全表的15%。mysql的执行优化器会默认放弃索引而扫描全表数据。从而会经常出现timeout.
优化后:
select * from order where id > xxx and create_time < '2021-11-18' and status = 8 limit 1000.
就是每次查询只查1000条,然后取出这1000条里面的max(id),这样循环的查完全表。
mysql放弃索引特殊情况。
age为索引列 数据类型隐式转换。
字符转int,如age为数值型,查询为SELECT * FROM student WHERE age='15' 这样会走索引。
int转字符, 如age为varchar型,查询为SELECT * FROM student WHERE age=15 这样会放弃索引。