在包含超过100万条目的数据库中,有时我们需要查找列号name
以数字开头的所有行。
这是目前正在使用的,但似乎可能有更有效的方式来做到这一点。
SELECT * FROM mytable WHERE name LIKE '0%' OR name LIKE '1%' OR name ...
等...
有什么建议吗?
答案 0 :(得分:6)
从表中选择*,其中your_field regexp'^ [0-9]'
答案 1 :(得分:3)
嘿 您应该在db中的字段中添加长度为1的索引。然后查询会明显加快。
ALTER TABLE `database`.`table` ADD INDEX `indexName` ( `column` ( 1 ) )
菲利克斯
答案 2 :(得分:1)
我的猜测是桌子上的索引没有被有效使用(如果有的话) 由于这是某种类型的char字段,如果这是此表的主要查询,您可以重构索引(我的mysql知识在这里有点简短,有人帮忙)这样这个表是有序的(聚簇索引)在ms sql)这个字段,因此你可以说像
select * from mytable where name < char(57) and name > char(47)
在那里进行一些测试,我不是100%关于mysql如何对这些角色进行排名的细节,但这应该让你顺利。
另一种选择是让一个新列在“starts_with_number”上给你一个真/假。您可以设置触发器来填充该列。这可能会产生最佳和最可预测的结果。
答案 3 :(得分:0)
我在想......
SELECT * FROM myTable WHERE IF( LEFT( name, 1) = '#', 1,0)
答案 4 :(得分:0)
如果你实际上没有使用返回的行中的每个字段,并且你真的想要从这个查询中榨取每一滴效率,那么不要使用select *,而是只指定你想要的字段处理。