Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
FAQ: Нахождение записей, где заданное значение находится между значениями полей
|
|||
|---|---|---|---|
|
#18+
Задача Быстро найти записи, где заданное (пользователем) значение находится между значениями полей. Требования (если вы не сможете этого проделать в своём случае, дальше можно не читать) Перевести таблицу, в которой идет поиск, на MyISAM или создать дополнительную таблицу на MyISAM, заполняемую при изменении первой триггерами или вручную. Примеры Найти звонки, начавшиеся, длившиеся или оконченные в определенное время. Выяснить принадлежность IP адреса определенному региону по БД GeoIP. Выяснить тариф звонка по определенному номеру назначения. Выяснить тариф звонка по определенному номеру назначения в определенное время суток. Выяснить тариф звонка по определенному номеру назначения в определенный момент времени (если хранятся все изменения тарифов во времени). Найти биржевые ордера, открытые до или в и закрытые в или после определенного времени. Формально Оптимизировать запросы Код: plaintext Код: plaintext Реализация на примере "Выяснить тариф звонка по определенному номеру назначения в определенный момент времени (если хранятся все изменения тарифов во времени)" + Подготовим данные Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. Заполним произвольными данными Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. Обычные запросы работают плохо индексы не сильно помогают: разброс дат-номеров достаточно равномерен и избавившись от full table scan всё равно приходится просматривать достаточное количество записей, из-за этого производительности в большинстве случаев недостаточно Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. Использование RTree индексов В MySQL есть сильно урезанная поддержка RTree индексов. Речь идет о (геометрических) spatial-индексах для MyISAM таблиц. К сожалению, для других типов таблиц данные индексы не поддерживаются и скорее всего в ближайшее время не будут. Преобразуем наш прайс-лист в MyISAM и добавим LINESTRING колонку Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. 5. 6. 7. Код: plaintext 1. 2. 3. Запросы по RTree индексу отрабатывают моментально RTree-индекс идеально подходит для такого типа запросов, просматривается всегда ровно столько строк, сколько будет в результате запроса. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. + Одним скриптом Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2010, 18:57 |
|
||
|
FAQ: Нахождение записей, где заданное значение находится между значениями полей
|
|||
|---|---|---|---|
|
#18+
В стартовом посте был рассмотрен вопрос оптимизации запроса Код: plaintext Оптимизация подобным способом запроса вида Код: plaintext 1. 2. 3. 4. 5. 6. 1. при наличии RTree индекса и проверки по нему любых двух условий, должно быть отобрано достаточно мало записей, чтобы остальные условия проверить не по индексу, а простым перебором, (по колонкам, участвующим в этих двух условиях, и следует построить LINESTRING колонку и RTree индекс по ней), 2. если п. 1 не исполняется и после отбора по индексу записей слишком много или нельзя выделить два условия, по которым всегда отбирается достаточно мало записей, то очень вероятна ошибка проектировщика или уникальный и интересный случай, который надо разобрать отдельно. Нерассмотренным остался только самый простой вариант Код: plaintext mysql.exe Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. queries Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2010, 19:48 |
|
||
|
FAQ: Нахождение записей, где заданное значение находится между значениями полей
|
|||
|---|---|---|---|
|
#18+
an0nymВыяснить принадлежность IP адреса определенному региону по БД GeoIP.В данном случае, если гарантированно известно, что диапазоны в таблице не пересекаются, и если нужно искать "мгновенное" событие, запрос оптимизируется следующим образом: Код: plaintext Также в данном случае необязательно переводить таблицу в MyISAM. С InnoDB должно работать тоже. В случае, если диапазоны в таблице идут не подряд (с пропусками), то нужно не забыть дополнительно проверить полученный результат на условие :value <= col2 . Это можно сделать как на клиенте, так и запросом: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2010, 13:04 |
|
||
|
FAQ: Нахождение записей, где заданное значение находится между значениями полей
|
|||
|---|---|---|---|
|
#18+
miksoft, OFFTOPIC: хороший пост, интуитивно понятно что нахождение по двум интервалам -- ето поиск прямоугольника на плоской поверхности. Т.е. аналог с ГЕО простои прямой. Аналогично поиск по Н интервалам -- есть поиск Н-мерного кирпича в Н-мерном пространстве. Как показал an0nym -- при Н>2 это теряет практический смысл т.к. строить 3-мерные (Н-мерные) индексы -- сложно (если вообше возможно...?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2010, 16:38 |
|
||
|
FAQ: Нахождение записей, где заданное значение находится между значениями полей
|
|||
|---|---|---|---|
|
#18+
javajdbcmiksoft, OFFTOPIC: хороший пост, интуитивно понятно что нахождение по двум интервалам -- ето поиск прямоугольника на плоской поверхности. Т.е. аналог с ГЕО простои прямой. Аналогично поиск по Н интервалам -- есть поиск Н-мерного кирпича в Н-мерном пространстве. Как показал an0nym -- при Н>2 это теряет практический смысл т.к. строить 3-мерные (Н-мерные) индексы -- сложно (если вообше возможно...?) Сомневаюсь, что это необходимо. Извратиться, думаю можно, но сама необходимости будет указывать на некоторую ошибку в проектировке (другими словами, я, например, не могу представить себе правильно спроектированное что-то, где это может понадобиться). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2010, 22:07 |
|
||
|
FAQ: Нахождение записей, где заданное значение находится между значениями полей
|
|||
|---|---|---|---|
|
#18+
an0nymСомневаюсь, что это необходимо.Хм, как насчет подбора товара по нескольким диапазонным характеристикам? Яндекс.Маркет, например? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2010, 20:32 |
|
||
|
FAQ: Нахождение записей, где заданное значение находится между значениями полей
|
|||
|---|---|---|---|
|
#18+
an0nym, авторЗадача Быстро найти записи, где заданное (пользователем) значение находится между значениями полей. вижу прямую связь с приемом, который я изложила в посекудной базе данные по форме счетчик,номер, время нач,время кон переводятся в рабоч табл счномер время нач+1сек+2секвремя кон из нее по заданному времени делаются -стадартный выбор с уплотнением по сч,номер -стандартная стыковка с основным массивом по сч и справочниками ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2010, 09:07 |
|
||
|
FAQ: Нахождение записей, где заданное значение находится между значениями полей
|
|||
|---|---|---|---|
|
#18+
miksoftan0nymВыяснить принадлежность IP адреса определённому региону по БД GeoIP.В данном случае, если гарантированно известно, что диапазоны в таблице не пересекаются, и если нужно искать "мгновенное" событие, запрос оптимизируется следующим образом: Код: plaintext По-моему, к ORDER BY надо добавить DESC, иначе находиться будет всегда самый 1-й диапазон. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2010, 16:44 |
|
||
|
FAQ: Нахождение записей, где заданное значение находится между значениями полей
|
|||
|---|---|---|---|
|
#18+
kestrelmiksoftan0nymВыяснить принадлежность IP адреса определённому региону по БД GeoIP.В данном случае, если гарантированно известно, что диапазоны в таблице не пересекаются, и если нужно искать "мгновенное" событие, запрос оптимизируется следующим образом: Код: plaintext По-моему, к ORDER BY надо добавить DESC, иначе находиться будет всегда самый 1-й диапазон.Да, совершенно верно! Спасибо за поправку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2010, 16:51 |
|
||
|
FAQ: Нахождение записей, где заданное значение находится между значениями полей
|
|||
|---|---|---|---|
|
#18+
an0nymИспользование RTree индекса Стоит отметить, что такое решение подвержено багу , который был исправлен в 5.0.82, 5.1.35, 6.0.12. У меня 5.0.67 перегружается при попытке создать SPATIAL индекс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.10.2010, 17:04 |
|
||
|
FAQ: Нахождение записей, где заданное значение находится между значениями полей
|
|||
|---|---|---|---|
|
#18+
Ссылка на тему: MySQL: оптимизация конструкции between ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2011, 15:03 |
|
||
|
FAQ: Нахождение записей, где заданное значение находится между значениями полей
|
|||
|---|---|---|---|
|
#18+
Еще задача, смежная с обсуждаемой: нахождение точек в двумерном пространстве, находящихся на заданной удаленности от заданной точки . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2011, 17:38 |
|
||
|
FAQ: Нахождение записей, где заданное значение находится между значениями полей
|
|||
|---|---|---|---|
|
#18+
Прочитал статью, но всё равно немного не понял (наверно сказывается 2 часа сна ;) ). Вопрос: мне нужно сделать выборку из базы данных основываясь на большом количестве параметров. (фильтр каталога техники (PHP)). Я предполагаю, что нужно делать так: $query = mysql_query("SELECT id FROM table_name WHERE rate >= 100, wifi = 1 и т.п. "); всё ли верно в запросе и синтаксисе? и как сделать такой запрос: WHERE имя_колонки от 100 до 200 Заранее спасибо за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2012, 19:12 |
|
||
|
FAQ: Нахождение записей, где заданное значение находится между значениями полей
|
|||
|---|---|---|---|
|
#18+
miksoftan0nymСомневаюсь, что это необходимо.Хм, как насчет подбора товара по нескольким диапазонным характеристикам? Яндекс.Маркет, например? для этого битмап индесы придумали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2012, 20:35 |
|
||
|
FAQ: Нахождение записей, где заданное значение находится между значениями полей
|
|||
|---|---|---|---|
|
#18+
Возможно кого-то натолкнет на новые мысли. С 5.6 можно будет делать так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2012, 13:33 |
|
||
|
FAQ: Нахождение записей, где заданное значение находится между значениями полей
|
|||
|---|---|---|---|
|
#18+
an0nymРечь идет о (геометрических) spatial-индексах для MyISAM таблиц. К сожалению, для других типов таблиц данные индексы не поддерживаются и скорее всего в ближайшее время не будут.Будущее наступило. http://dev.mysql.com/doc/refman/5.7/en/create-index.html Available only for MyISAM and (as of MySQL 5.7.5) InnoDB tables . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2016, 23:22 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=84&tid=1831101]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
26ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
84ms |
get tp. blocked users: |
2ms |
| others: | 248ms |
| total: | 398ms |

| 0 / 0 |
