专栏名称: 数据分析与开发
伯乐在线旗下账号,分享数据库相关技术文章、教程和工具,另外还包括数据库相关的工作。偶尔也谈谈程序员人生 :)
目录
相关文章推荐
AustinDatabases  ·  哎,马上删,马上 ·  昨天  
终码一生  ·  如何加快 SQL 查询速度的同时保持 ... ·  2 天前  
51好读  ›  专栏  ›  数据分析与开发

MySQL 的 20+ 条最佳实践

数据分析与开发  · 公众号  · 数据库  · 2016-11-30 20:43

正文

请到「今天看啥」查看全文


// ...

}

// much better:

$ r = mysql_query ( "SELECT 1 FROM user WHERE state = 'Alabama' LIMIT 1" );

if ( mysql_num_rows ($ r ) > 0 ) {

// ...

}


4. 索引搜索字段


索引不仅仅是为了主键或唯一键。如果你会在你的表中按照任何列搜索,你就都应该索引它们。



正如你所看到的,这个规则也适用于如 “last_name LIKE ‘a%'”的部分字符串搜索。当从字符串的开头搜索时,MySQL就可以使用那一列的索引。


你也应该明白什么样搜索可以不使用有规律的索引。例如,当搜索一个单词时(例如,”WHERE post_content LIKE ‘%apple%'”),你将不会看到普通索引的好处。你最好使用 mysql 全文搜索或者构建你自己的索引解决方案。


5. 索引并对连接使用同样的字段类型


如果你的应用程序包含许多连接查询, 你需要确保连接的字段在两张表上都建立了索引。 这会影响MySQL如何内部优化连接操作。


此外,被连接的字段,需要使用同样类型。例如, 如果你使用一个DECIMAL字段, 连接另一张表的INT字段, MySQL将无法使用至少一个索引。 即使字符编码也需要使用相同的字符类型。


// looking for companies in my state

$ r = mysql_query ( "SELECT company_name FROM users

LEFT JOIN companies ON (users.state = companies.state)

WHERE users.id = $user_id" );

// both state columns should be indexed

// and they both should be the same type and character encoding

// or MySQL might do full table scans


6. 不要ORDER BY RAND()


起初这是一个听起来挺酷的技巧, 让许多菜鸟程序员陷入了这个陷阱。但你可能不知道,一旦你开始在查询中使用它,你创建了非常可怕的查询瓶颈。


如果你真的需要对结果随机排序, 这有一个更好的方法。补充一些额外代码,你将可以防止当数据成指数级增长时造成的瓶颈。关键问题是,MySQL必须在排序之前对表中的每一行执行RAND()操作(这需要处理能力),并且仅仅给出一行。


// what NOT to do:

$ r = mysql_query ( "SELECT username FROM user ORDER BY RAND() LIMIT 1" );

// much better:

$ r = mysql_query ( "SELECT count(*) FROM user" );

$ d







请到「今天看啥」查看全文