1.索引的优点
无索引的表就是一组无序的行,如果要查询,要进行全表扫描。使用索引提高查询效率的做法是,我们可以得知匹配行在什么位置结束,从而跳过其余部分。另一种是利用定位算法,不用从索引开始位置进行线性扫描,即可直接找到第一个匹配项(例如利用二分搜索比扫描要快很多)
为何不直接对行数据进行排序,省掉索引操作呢? 如果表里只有一种索引,那是可以这么做的,但是你可能还想添加第二个索引,但又不能同时按两种方式对数据进行排序。
对于不同的Mysql存储引擎,索引的具体实现细节会有所不同。
Mysql使用索引的方式有以下几种;
索引可以用于加快对WHERE子句匹配的行进行搜索的速度,或者用于加快对,与另一个连接表里的行匹配的行,进行搜索的速度。
对于使用MIN(), MAX()函数的查询,Mysql可以在不用逐行检查的情况下,快速找到索引列里的最小值最大值。
对于ORDER BY 和 GROUP BY 子句,Mysql 经常使用索引来高效地完成分类和分组操作。
2. 索引的代价
索引可以加快检索速度,但是它同时也降低了索引列插入、删除和更新值的速度。其次索引也会占用磁盘空间,多个索引会占据更大的空间。与没有索引相比,使用索引会让你很快便达到表的大小极限。
3. 挑选索引
(1)为用于搜索、排序或分组的列创建索引,而对于用作输出显示的列则不用创建索引。
(2)认真考虑数据列基数:某个列包含值1,3,4,7,4,7,那么它的基数是4,相对于表里行的总数来说,列的基数越高,索引的效果越好。
(3)索引短小值:选用较小的数据类型
(4)索引字符串值的前缀
(5)利用最左前缀
(6)不要建立过多的索引
(7)让参与比较的索引类型保持匹配
(8)利用慢查询日志找出那些性能低劣的查询
4. Mysql查询优化程序
可以用EXPLAIN来显示SELECT是如何工作的,即是否使用索引还有其他信息,如下
EXPLAIN SELECT *FROM mytable WHERE...
查询优化程序的工作原理
(1)分析表。ANALYSE TABLE 来分析表,这将生成关于键值分布情况的统计数据,它们可以帮助优化程序更准确地评估索引效率。
(2)使用EXPLAIN验证优化程序的操作。
(3)在必要时给予优化程序提示或改写它。在连接操作的列表里,可以在表名后面加上FORCE INDEX、USE INDEX或IGNORE INDEX,以告知服务器期望使用哪儿些索引。
(4)比较拥有相同数据类型的列。
(5)让索引列在比较表达式中单独出现
WHERE mycol *2<4
WHERE mycol<4/2
对于第一行,没有用到索引,先计算乘法,需要扫描全表
第二行,先计算除法,用到索引,找到表中小于2的数据
(6)不用在LIKE模式的开始位置使用通配符
WHERE mycol LIKE '%string%';
如果想要把无论是否出现在该列里的所有字符串都找出来,那么这个句子没错。如果只想把出现在该列开始位置的字符串找出来,则需要删除第一个‘’%‘’。
(7)避免过多的使用自动类型转换
SELECT *FROM mytable WHERE i=4;
SELECT *FROM mytable WHERE i='4';
如果想要给一个表中的某一列添加索引,可以用ALTER TABLE 表名 ADD INDEX (列名);
5.选择利于高效查询的数据类型
多用数字运算,少用字符串运算
当较小类型够用时,就不用较大类型
考虑使用ENUM列
使用PROCEDURE ANALYSE()
整理表碎片
把数据压缩到BLOB或TEXT列
使用合成索引