如何使用NULL提高MySQL查询的性能?

Neokio

下表中有几百万条记录:

CREATE TABLE `customers` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `store_id` int(10) unsigned DEFAULT NULL,
  `first_name` varchar(64) DEFAULT NULL,
  `middle_name` varchar(64) DEFAULT NULL,
  `last_name` varchar(64) DEFAULT NULL,
  `email` varchar(128) DEFAULT NULL,
  `phone` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `index_store_email` (`store_id`,`email`),
  KEY `index_store_phone` (`store_id`,`phone`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

查询#1大约需要800毫秒:
SELECT COUNT(*) FROM `customers` WHERE `store_id` = 1;

查询#2大约需要1.5毫秒:
SELECT COUNT(*) FROM `customers` WHERE `store_id` = 1 AND `email` IS NULL;

查询#3耗时5秒
SELECT COUNT(*) FROM `customers` WHERE `store_id` = 1 AND `email` IS NOT NULL;

笔记:

  • 我简化了表格以提出问题,但是查询是相同的。
  • 是的,我的桌子已经过优化。
  • 是的,两个字段都已建立索引,请参见上面的create语法。
  • 只有几个store_ids,但是每个记录都有一个。
  • email设置为的客户很少null

我发现这里有些奇怪:

  1. 查询#1最简单!只有几个可能的INT值。不应该最快吗?
  2. 为什么查询3这么慢?通过执行其他两个查询,然后从#2中减去#1,我可以将时间减少一半,但我不必这样做。

对这个看似基本的问题有什么想法吗?感觉就像我错过了一些简单的事情。我在DB学校上过课吗?

沃尔夫

有时,MySQL查询解析器在决定使用哪个索引时会猜错。对于此类情况,索引提示可能会有用(http://dev.mysql.com/doc/refman/5.7/en/index-hints.html

强制使用索引:

SELECT * FROM table1 USE INDEX (col1_index,col2_index)
  WHERE col1=1 AND col2=2 AND col3=3;

要强制使用索引,包括替换表扫描,请执行以下操作:

SELECT * FROM table1 FORCE INDEX (col1_index,col2_index)
  WHERE col1=1 AND col2=2 AND col3=3;

要忽略某个索引:

SELECT * FROM table1 IGNORE INDEX (col3_index)
  WHERE col1=1 AND col2=2 AND col3=3;

要调试正在使用的索引,可以使用以下EXPLAIN语句:(https://dev.mysql.com/doc/refman/5.7/en/explain-output.html

EXPLAIN SELECT * FROM table1
  WHERE col1=1 AND col2=2 AND col3=3;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何提高BigQuery中的GeoIP查询性能?

来自分类Dev

如何通过许多JOIN提高查询性能

来自分类Dev

如何提高SQL Server Select查询的性能?

来自分类Dev

如何提高MongoDB聚合查询的性能?

来自分类Dev

使用OR时,MYSQL可提高查询性能

来自分类Dev

如何提高ORDER BY ... LIMIT ...查询性能?

来自分类Dev

如何使用`OR`来提高密码查询的性能?

来自分类Dev

提高MySQL中的查询性能

来自分类Dev

如何提高mysql查询的性能?

来自分类Dev

蜂巢如何提高我的查询性能?

来自分类Dev

如何强制联接顺序以提高MYSQL中的查询性能?

来自分类Dev

如何提高PostgreSQL查询性能

来自分类Dev

如何提高此视图/查询的性能?

来自分类Dev

如何提高BigQuery中的GeoIP查询性能?

来自分类Dev

提高性能的MySQL查询

来自分类Dev

如何通过许多JOIN提高查询性能

来自分类Dev

如何提高SQL Server Select查询的性能?

来自分类Dev

MySQL查询性能提高了吗?

来自分类Dev

如何提高此SQL Server查询的性能?

来自分类Dev

如何提高查询执行性能

来自分类Dev

如何提高mysql查询的性能?

来自分类Dev

如何提高pymongo查询的性能

来自分类Dev

如何提高复杂的 MySQL 选择查询的性能?

来自分类Dev

如何提高此查询的性能

来自分类Dev

提高 Mysql 查询性能(索引类型使用说明)

来自分类Dev

MySQL - 需要帮助提高查询性能

来自分类Dev

如何提高 mongoDb 查询性能?

来自分类Dev

如何提高sql查询的性能

来自分类Dev

如何在 Python 上提高 MySQL 查询的性能