mysql查詢之間 MySQL 查詢之間的最佳索引

2021-10-18 22:37:57 字數 1269 閱讀 3618

我有乙個具有以下結構的表:

create table `geo_ip` (

`id` bigint(20) not null auto_increment,

`start_ip` int(10) unsigned not null,

`end_ip` int(10) unsigned not null,

primary key (`id`),

key `start_ip` (`start_ip`),

key `end_ip` (`end_ip`),

key `start_end` (`start_ip`,`end_ip`),

key `end_start` (`end_ip`,`start_ip`)) engine=innodb;

mysql似乎無法在我的大多數查詢中使用索引,因為where子句使用介於start_ip和end_ip之間的介於兩者之間:

select * from geo_ip where 2393196360 between start_ip and end_ip;

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | extra |

| 1 | ****** | geo_ip | all | start_ip,end_ip,start_end,end_start | null | null | null | 2291578 | using where |

該錶有幾百萬條記錄.我嘗試通過刪除start_ip和end_ip列來擴充套件表,並為start_ip和end_ip的每個可能值建立乙個行作為id,然後查詢id.雖然這大大提高了查詢效能,但它導致表大小從不到1千兆位元組增長到數十千兆位元組(表中顯然還有其他列).

還有什麼可以提高查詢效能?我可以以某種方式更改查詢,還是可以不同地索引列以導致命中?或者也許是我還沒有想到的東西?

奇怪的是,索引用於某些值.例如:

explain select * from geo_ip where 3673747503 between start_ip and end_ip;

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | extra |

| 1 | ****** | geo_ip | range | start_ip,end_ip,start_end,end_start | end_ip | 4 | null | 19134 | using where |

mysql優化的查詢語句 優化MySQL查詢語句

前言 查詢語句的優化是sql效率優化的乙個方式,可以通過優化sql語句來盡量使用已有的索引,避免全表掃瞄,從而提高查詢效率。最近在對專案中的一些sql進行優化,總結整理了一些方法。1 盡量避免在 where 子句中對字段進行 null 值判斷 應盡量避免在 where 子句中對字段進行 null 值...

mysql 分區間查詢 MySQL區間分組查詢

假設a表為會員資訊表,需要統計男性會員年齡各階段的出現的人數 create table a id int 11 unsigned not null auto increment,name varchar 255 not null default comment 會員名稱 tinyint 1 unsi...

mysql怎麼查詢列命令 mysql常用查詢命令

常用mysql命令 show variables like character set client 查詢字符集 show databases 列出所有的伺服器上的資料庫alter create database if not exists test 建立乙個資料庫 drop database fk...