Mysql 在一个大表中搜索varchar

Mysql 在一个大表中搜索varchar,mysql,sql,select,ip,varchar,Mysql,Sql,Select,Ip,Varchar,我有一个500万行的表+,我有一个varchar(50)字段来保存IP 运行此查询时,需要花费大量资源和时间: SELECT * FROM table WHERE ip = 'xx.xxx.xx.xxx' LIMIT 1 如何改进此过程?您需要在ip列上建立索引: create index idx_table_ip on table(ip) 然后,假设没有太多的重复项,您的查询应该快速运行 让我澄清最后一点。重复项不会影响此查询的运行时。但是,当使用limit时,您应该有一个orderby,

我有一个500万行的表+,我有一个
varchar(50)
字段来保存IP

运行此查询时,需要花费大量资源和时间:

SELECT * FROM table WHERE ip = 'xx.xxx.xx.xxx' LIMIT 1

如何改进此过程?

您需要在
ip
列上建立索引:

create index idx_table_ip on table(ip)
然后,假设没有太多的重复项,您的查询应该快速运行


让我澄清最后一点。重复项不会影响此查询的运行时。但是,当使用
limit
时,您应该有一个
orderby
,以便结果稳定(使用两次查询将返回相同的行)。在这种情况下,您应该在索引中包括
orderby
列(如果可能)。如果没有,匹配数将影响性能。

停止运行该查询。是否有索引?不要选择*。。选择特定字段如果可以修改表架构,请将IP列更改为UNSIGNED INT,然后使用INET_ATON将虚线IP转换为4字节UNSIGNED INT IP。应该比字符串比较快得多。该列上的索引也会有所帮助。使用
ip2long
功能将
ip
字符串转换为
long
。将此值存储在数据库中。要检索
字符串
请使用
long2ip
函数。谢谢!但现在我有另一个问题。当我在
varchar(50)
中用ip列连接两个表(通过索引int)时,我使用
其中t1.ip='''..'或t2.ip=''''.'
,这需要很多时间time@ArielAharonson . . . 你应该以问题的形式提问,而不是以评论的形式提问。问另一个问题,包括感兴趣的查询和表格布局。