首页 > 代码库 > mysql重点--正确使用

mysql重点--正确使用

1.一些错误情况

数据库表中添加索引后确实会让查询速度起飞,但前提必须是正确的使用索引来查询,如果以错误的方式使用,则即使建立索引也会不奏效。
即使建立索引,索引也不会生效:

 1 - like ‘%xx‘
 2     select * from tb1 where name like ‘%cn‘;
 3 - 使用函数
 4     select * from tb1 where reverse(name) = ‘wupeiqi‘;
 5 - or
 6     select * from tb1 where nid = 1 or email = ‘seven@live.com‘;
 7     特别的:当or条件中有未建立索引的列才失效,以下会走索引
 8             select * from tb1 where nid = 1 or name = ‘seven‘;
 9             select * from tb1 where nid = 1 or email = ‘seven@live.com‘ and name = ‘alex‘
10 - 类型不一致
11     如果列是字符串类型,传入条件是必须用引号引起来,不然...
12     select * from tb1 where name = 999;
13 - !=
14     select * from tb1 where name != ‘alex‘
15     特别的:如果是主键,则还是会走索引
16         select * from tb1 where nid != 123
17 - >
18     select * from tb1 where name > ‘alex‘
19     特别的:如果是主键或索引是整数类型,则还是会走索引
20         select * from tb1 where nid > 123
21         select * from tb1 where num > 123
22 - order by
23     select email from tb1 order by name desc;
24     当根据索引排序时候,选择的映射如果不是索引,则不走索引
25     特别的:如果对主键排序,则还是走索引:
26         select * from tb1 order by nid desc;
27  
28 - 组合索引最左前缀
29     如果组合索引为:(name,email)
30     name and email       -- 使用索引
31     name                 -- 使用索引
32     email                -- 不使用索引

2.其他注意事项

- 避免使用select *

count(1)或count(列) 代替 count(*)
- 创建表时尽量时 char 代替 varchar
- 表的字段顺序固定长度的字段优先
- 组合索引代替多个单列索引(经常使用多个条件查询时)
- 尽量使用短索引
- 使用连接(JOIN)来代替子查询(Sub-Queries)
- 连表时注意条件类型需一致
- 索引散列值(重复少)不适合建索引,例:性别不适合

3.limit分页

这里只做简单表述。在使用
 
select sth from table_name limit 0,10;
 
过程中发现当数据量大的时候。比如limit 24322,10需要ALL遍历到两万条后才会拿到
所需要的数据。需要的时间非常长,优化为:
 
select * from bigdata where nid > 3000 limit 3000,10;
 
这样会进行range查询。速度非常快,所做的仅仅是记录下上次查询过的nid就行。
同样在直接输入页数比如客户输入4989,怎么样处理?
利用B-tree数组来先粗略定位页数也许可行。
 

 

mysql重点--正确使用