标签:修改 精确 HERE 引擎 多个 creat auto ima ber
例子:
create table person_info( id int not null auto_increment, name varchar(100) not null, birthday date not null, phone_number char(11)not null, country varchar(100) not null, primary key(id), key idx_name_birthday_phone_number (name, birthday, phone_number) );
如果不是按照B+树的排列顺序,是无法用到索引的;因为索引是按照那个顺序进行排列的。
反正你就从name----birthday-----phone_number进行查找就肯定能用到索引,如果你直接跳过name,去查找birthday,那肯定是不行的。
SELECT * FROM person_info WHERE name LIKE ‘As%‘;
这个肯定是可以的,因为字符串排序,就是从第一个字母开始排序的。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SELECT * FROM person_info WHERE name LIKE ‘%As%‘;
这个肯定是不可以的
SELECT * FROM person_info WHERE name > ‘Asa‘ AND name < ‘Barlow‘;
这个肯定是可以用到索引的。
-------------------------------------------------------------------------------------------------------------------------------
SELECT * FROM person_info WHERE name > ‘Asa‘ AND name < ‘Barlow‘ AND birthday > ‘1980-01-01‘;
这个只能用到name索引,而无法用到birthday索引;因为只有在name相同时,才能使用到birthday索引
上sql语句的查询方式是:
SELECT * FROM person_info WHERE name = ‘Ashburn‘ AND birthday > ‘1980-01-01‘ AND birthday < ‘2000-12-31‘ AND phone_number > ‘15100000000‘;
name = ‘Ashburn‘ ,对name列进行精确查找,是可以用到B+树的
SELECT * FROM person_info ORDER BY name, birthday, phone_number LIMIT 10;
order by 子句后面如果不加ASC或者DESC默认是按照升序
SELECT * FROM person_info ORDER BY name, birthday DESC LIMIT 10;
上述语句:就会很烦,先从name值最小的中找,然后不够十条,再从name值第二小的中找,然后往复这个过程。其实我也觉得没那么麻烦
SELECT * FROM person_info WHERE country = ‘China‘ ORDER BY name LIMIT 10;
有时候,用来排序的多个列不是一个索引里面的,这种情况也不能使用到索引进行排序
废话!!
SELECT * FROM person_info ORDER BY UPPER(name) LIMIT 10;
SELECT name, birthday, phone_number, COUNT(*) FROM person_info GROUP BY name, birthday, phone_number
肯定可以,分组列的顺序和索引列的顺序一致
耗时就完事了
会使用到两个索引
访问二级索引使用顺序I/O,访问聚簇索引使用随机I/O
说白了,就是查找索引列,不查别的,就不用回表了。
SELECT name, birthday, phone_number FROM person_info WHERE name > ‘Asa‘ AND name < ‘Barlow‘
只为用于搜索、排序或者分组的列创建索引
考虑列的基数
基数就是:一个集合中,不同的个数;假如(1,1,2,2,2,1)基数为2。
列的技术越大,该列的值越分散,列的基数越小,该列中的值越集中。
最好是将基数大的列建立索引,这样索引涵盖面会很大,可以精确的查找到很多的数据。
索引列的类型尽量小:内存啊,大哥;查询也快
索引字符串的前缀:因为有很多时候,我们并比不了很长的字符串
但是这样的话,就不能对列进行排序了。
WHERE my_col * 2 < 4 WHERE my_col < 4/2
上述代码中,第二行比第一行快很多
让主键具有AUTO_INCREMENT, 让存储引擎自己为表生成主键, 而不是我们手动插入
瞎JB乱插,每次都会修改B+树的。
别建立冗余和重复的索引
标签:修改 精确 HERE 引擎 多个 creat auto ima ber
原文地址:https://www.cnblogs.com/sicheng-li/p/13137551.html