我有乙個具有以下結構的表:
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...